注:本人已有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也可以作为函数的值,那么函数到底是值类型还是引用类型?这个问题其实很复杂,有争议,因为函数的性质比较特殊:你创建函数时,内存存的是值,即代码,调用函数时,用的也是值,但赋值时却用的是函数的引用,所以我个人倾向于函数是值类型,但有引用类型的特点。所以讲值类型和引用类型时,一般不提函数。
golang学习笔记7-指针、值类型与引用类型【重难点】
于 2024-09-22 18:34:38 首次发布