go入门指南--指针相关定义?
1. 前言
原意是因为看完入门指南之后对于指针、引用类型及切片相关概念不清晰,但是原问题描述不清晰,并且问题已经得到解决,以下将本问题修改为关于指针、切片、引用类型相关我个人理解的知识点。
。
注意
入门指南中7.2章节原文说切片就是指针是一个错误说法,已经提交文章纠错。
注意 Go slice 不是指针,而是包含指针的结构体(源码出处:github.com/golang/go/blob/master/s...)
指针
fmt.Println("对于go中的变量我们可以使用&获取其地址。", "通过 *指针变量 即可操作地址对应的内存")
fmt.Println("格式: var 指针变量名 *类型 = &变量")
fmt.Println("指针:变量的地址")
fmt.Println("指针变量:存储地址的变量", "指针变量也是变量, 只不过它保存的是地址, 地址指向对应的值")
fmt.Println("指针类型:指针变量的类型")
fmt.Println("golang中变量传递都是值传递,没有引用传递")
空指针
fmt.Println("空指针也是有地址的, 它已经分配好了内存, 因为指针也是有零值的, 而nil就是指针的零值")
fmt.Println("因为空指针没有指向一块合法的内存,所以不能操作其指向的内存")
fmt.Println("指针本身被分配了内存, 但是指针指向的内存并没有分配所以需要给指针赋一个初始值才可以")
指针赋值
fmt.Println("1. 创建一个变量并取其&符", "2. 使用new函数。")
common.PrintVar("new 函数", "接受一个类型,自动创建改类型的零值并返回其指针(动态分配空间)")
common.PrintVar("new 函数", "返回一个指向类型为 T,值为 零值 的地址的 !!指针!!")
切片
fmt.Println("切片本身是一个结构体,内部有一个指针,这个指针指向一个数组。")
fmt.Println("切片有三个字段,分别是指向底层数组的指针、长度、容量")
fmt.Println("https://github.com/ffhelicopter/Go42/issues/7 :\n", "Go slice 不是指针,而是包含指针的结构体")
fmt.Println("总结:切片是一种引用类型,因为切片的存储的是底层数组的指针")
引用类型
fmt.Println("引用类型的变量存储的是变量的值所在的 内存地址或者内存地址中的第一个字所在的位置(这个内存地址就是指针)")
fmt.Println("引用类型的特点,变量存储的是一个地址,这个地址对应的空间才真正存储的数据,内存分配通常在 堆(heap) 上分配,当没有任何变量引用这个地址的时候,该地址对应的数据空间会被GC回收")
fmt.Println("复杂的数据通畅需要使用多个字,这些数据一般使用引用类型保存")
fmt.Println("被引用的变量会存储在堆中,以便进行垃圾回收,且比栈拥有更大的内存空间")