golang学习笔记7-指针、值类型与引用类型【重难点,推荐收藏】

news/2024/9/22 22:44:12 标签: golang, 学习, 笔记

注:本人已有C,C++,Python基础,只写本人认为的重点。
虽然go的指针概念,用法(取地址,解引用)和C/C++一样,但还是有些地方需要牢记而且很重要。
go和C/C++定义指针的语法不同,C/C++的星号在变量类型之后,go的星号在前:var 变量名 *变量类型。
内存通常分为四大块:堆区,栈区,全局区,代码区,这些概念百度了解即可。go中的变量按其内存分配机制,有值类型和引用类型。值类型就是变量直接存储值,在栈中存储,引用类型就是变量存放另一个变量的地址,在堆中存储。当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由go编译器(GC)来回收,这就是go的垃圾回收机制,避免了C/C++中的内存泄漏问题。
注意:这里说的是内存理论,实际上,go对值类型和引用类型的分配比较模糊,有时值类型也会存在堆上,或者引用类型存在栈上。
在go中,值类型和引用类型分别有多种,如下:
六个值类型:整数型,浮点型,bool,字符串,数组,结构体
五个引用类型:指针(pointer),切片(slice),映射(map),管道(channel),接口(interface)

我们都知道C/C++有空指针NULL,但go没有空指针,只有空引用nil,nil的官方解释是:nil is a predeclared identifier representing the zero value for a pointer, channel, func, interface, map, or slice type.
不难发现,nil也可以作为函数的值,那么函数到底是值类型还是引用类型?这个问题其实很复杂,我通过看博客和问chatgpt,总算有个大致理解了:函数是值类型,但有引用类型的特点。首先,函数本身存放的是值,即一段代码,而不是地址,这决定了它是值类型,而不是引用类型。但当函数赋值给变量时,赋值的又是一段函数代码的地址(引用),不是函数代码本身。
换个方式理解就是:
值类型:本身存值,赋值存值。
引用类型:本身存地址,赋值存地址。
函数:本身存值,赋值存地址
决定值类型和引用类型的关键在于本身存的是值还是引用,所以函数是特殊的值类型,一般不归类,否则很容易混淆。


http://www.niftyadmin.cn/n/5670922.html

相关文章

【后端开发】JavaEE初阶—线程的理解和编程实现

前言: 🌟🌟本期讲解多线程的知识哟~~~,希望能帮到屏幕前的你。 🌈上期博客在这里:【后端开发】JavaEE初阶——计算机是如何工作的???-CSDN博客 🌈感兴趣的小伙…

Redis数据结构之哈希表

这里的哈希表说的是value的类型是哈希表 一.相关命令 1.hset key field value 一次可以设置多个 返回值是设置成功的个数 注意,哈希表中的键值对,键是唯一的而值可以重复 所以有下面的结果: key中原来已经有了f1,所以再使用hse…

python基础题练习

1.可否定义一个sum函数呢?返回指定区间的值的和?例如,区间[1,4]的和为123410返回指定区间值的平方的和呢?立方呢? 代码: # 计算从start到end(包括end)的所有整数的和。 def sum_ra…

整合多方大佬博客以及视频 一文读懂 servlet

参考文章以及视频 文章: 都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet_servlet用得多吗-CSDN博客 【计算机网络】HTTP 协议详解_3.简述浏览器请求一个网址的过程中用到的网络协议,以及协议的用途(写关键点即可)-CSDN博客 【…

hydra.core.config_store中ConfigStore的用法

与直接在目录里面添加yaml文件不同,ConfigStore支持使用类的方法,定义配置。参考资料:Config Store API | Hydra 假设我们的目录结构是: ├─ conf │ └─ dataset │ └─ coco.yaml └── main.py我们可以很方便的用H…

【案例】--mongodb的响应慢思考案例

目录 一、问题现象及思考思路1、问题现象2、思考思路3、问题分析二、对mongodb查询的影响有哪些1、单条数据大,对查询的影响2、mongodb硬件性能,对查询的影响三、分页查询问题及优化策略1、索引有效利用2、基于索引的游标分页3、聚合策略4、减少查询返回的数据量5、缓存机制6…

[001-02-001].第2节:java开发环境搭建

4.1.书籍推荐: 4.2.人机交互方式 1.图形化界面(Graphical User Interface GUI)这种方式简单直观,使用者易于接受,容易上手操作2.命令行方式(Command Line Interface CLI):需要有一个控制台,输入特定的指令&#xff0c…

着色器ShaderMask

说明 实现一个渐变进度条,要求: 颜色渐变的过程是循序渐进的,而不是看起来像是将渐变条逐渐拉长了。 效果 源码 // 渐变进度条Stack(children: [// 背景色板Container(width: 300,height: 8,decoration: BoxDecoration(borderRadius: Bord…