指针:一个指针指向了一个值的内存地址。类似于变量和常量,再使用指针前你i需要声明指针。
指针声明格式如下:
*是取指针的值,&是取变量的指针
var var_name *var-type // var-type为指针类型,var_name为指针变量,*号用于指定变量是作为一个指针
var ip *int // 指向整型 声明指针变量
var fp *float32 //指向浮点型
var a int = 20 // 声明实际变量
ip = &a // 指针变量的存储地址
fmt.Printf("a 变量的地址是:%x\n",&a) // a 变量的地址是:c00000a0a8
fmt.Printf("ip 变量存储的指针地址:%x\n",&ip) // ip 变量存储的指针地址:c000006028
// 使用指针访问值
fmt.Printf("*ip 变量的值:%d\n",*ip) // *ip 变量的值:20
*和&有什么区别
&是取地址符号,即取得某个变量的地址,如;&a
*是指针运算符,可以表示一个变量是指针类型,也可以表示一个指针变量所指向的存储单元,也就是这个地址所存储的值
空指针:当一个指针被定义后没有分配到任何变量时,他的值为nil(nil指针,也被成为i空指针)
nil 再概念上和其他语言的null,Nine,NULL一样,都指代零值或空值,一个指针变量通常缩写为ptr
var ptr *int
fmt.Printf("ptr 的值为:%x\n",ptr) // ptr 的值为:0
// 空指针的判断
//if (ptr != nil) // ptr 不是空指针
//if (ptr == nil) // ptr 是空指针
var new和make的区别
var 用来声明一个变量,并指明变量的数据类型(不会分配内存)。
new和make都是用来内存分配的。make用于内建模型(map,slice,和channel)的内存分配。new用于各种类型的内存分配
从返回值上来说make返回的是引用类型本省;而new返回的是指向类型的指针
定义:func new(Type) *Type
new的主要特性:
内建函数new用来分配内存,他的第一个参数是一个类型,不是一个值,他的返回值是一个指向新分配类型零值的指针
自己实现new功能:
func newInit() *int {
var i int
return &i
}
type Rect struct {
width float64
herght float64
}
func (r *Rect) size()float64{
return r.width * r.height
}
func main() {
someInt := newInit()
fmt.Println(someInt) // 0xc00000a0b8 打印出来是一个指针
someInt_1 := new(int)
fmt.Println(someInt_1) // 0xc00000a0f0 效果与这个一样
}
make的主要特性
官方文档描述如下: 内建函数make用来为slice,map或chan类型分配内存和初始化一个对象(注意只能用在这三种类型上),跟new类似,第一个参数也是一个类型 而不是一个值,跟new不同的是,make返回类型的引用而不是指针,而返回值也依赖于具体传入的类型。 具体说明如下: slice:第二个参数size指定了它的长度,它的容量和长度相同 eg:make([]int,0,10) Map:根据size大小来初始化分配内存,不过分配后的map长度为0,如果size被忽略了,那么会在初始化分配内存时分配一个小尺寸的内存 Channel:管道缓冲区依据缓冲区容量被初始化。如果容量为0或者忽略容量,管道是没有缓冲区的 总结:new的作用是初始化一个指向类型的指针(*T),make的作用是为slice,map,或chan初始化并返回切片本身