查看上一篇数组类型请点我
2.指针类型
指针这个东西啊,开始真的是让我费解,为什么需要这个东西呢,感觉根本没有用啊,但是go说:我不要你觉得,我要我觉得。然后就仔细的研究了一下,原来这个东西还是很有用的,接下来先说说go指针是什么以及指针的使用场景。
指针变量即一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。
指针的使用场景:
1.当作为方法的receiver
时,如果你的方法会改变receiver
时,你必须传递指针(此条最重要,然后学到这块的同学根本不知道receiver是什么,所以看到这条时并不需要纠结)。
2.作为入参时,golang是值拷贝传递, 如果是比较大的struct(一种更高级的数据类型,就当作占用内存很大的一个参数)
作为参数,那么显然拷贝一个指针比拷贝整个结构代价要小一些。
所以,到此只当作指针可以提高效率就好了(receiver的事到receiver再谈),因为传递一个几个字节的指针总比传一个超级大字符串(参数)要高效。
下面介绍指针的用法,只需要记住两点:
1. &,取地址操作符,获取变量的地址
2. *,定义指针变量,获取指针变量指向的变量值
package main
import "fmt"
func main() {
var vara = 100
var ip *int
ip = &vara
fmt.Println("变量vara的地址是:", ip)
fmt.Println("变量vara的值:", *ip )
}
输出结果:
变量vara的地址是: 0xc000016058
变量vara的值: 100
指针作为参数传递:相当于浅拷贝
package main
import "fmt"
func main() {
var a = 100
var b = 200
fmt.Printf("交换前 a 的值 : %d\n", a )
fmt.Printf("交换前 b 的值 : %d\n", b )
swap(&a, &b)
fmt.Printf("交换后 a 的值 : %d\n", a )
fmt.Printf("交换后 b 的值 : %d\n", b )
}
func swap(x *int, y *int) {
var temp int
temp = *x
*x = *y
*y = temp
}
输出结果:
交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100
查看下一篇结构体类型请点我