依稀记得大学必修课,C语言中的指针,简直是噩梦,指来指去,有没有晕乎乎的感受,我在想是否是也由于如此,因此Java语言的开发者C才比C语言的多,Java正由于解决了C的痛点,因此今天才能变成语言排行榜占其首,Go做为后起之秀,又引入这么复杂难懂的概念,可见指针咱们仍是须要学习的,下面咱们一块儿体验一下go的指针吧golang
在Go中指针有两个概念,一个指针变量是能够指向任何一个值的内存地址,指针变量也是占用存储空间的,在32位系统中占用4个字节,在64位系统中占用8个字节,与这个地址存储的值的大小没有关系指针类型指针类型和指针变量一块出现,指的是这个指针变量的类型是什么,好比咱们声明了一个
temp int = 1
,那么temp变量的这个类型是 int,同时指针变量也是有指针类型的,用 *T表示,T是type的意思,表明具体的类型,好比pointTemp *int = &temp
, 表明 pointTemp这个变量是指针变量,类型是*int
咱们看下面一段代码编程
func PointStudy() { // 每个变量在运行时都有一个地址(这个地址存储着这个变量对应的值) var temp int = 1 // go语言的取地址符, temp 变量,经过&符号来获取temp这个变量在内存中的地址,咱们将获取到的地址赋值给一个指针变量 pointTemp ,类型*int var pointTemp *int= &temp fmt.Println(temp) fmt.Println(pointTemp) } //输出结果 1 0xc00005a2d0
指针变量也是变量,变量、指针和地址三者的关系是:每个变量都有本身地址,每个指针的值就是地址(也就是这个指针经过fmt.Println输出后一个地址)微信
如何获取指针对应的地址的值,go语言中经过 &符号 获取变量地址,经过 * 来获取地址存储的值编程语言
func PointStudy() { // 每个变量在运行时都有一个地址(这个地址存储着这个变量对应的值) var temp int = 1 // go语言获取地址符, temp 变量,经过&符号来获取temp这个变量在内存中的地址,咱们将获取到的地址赋值给一个指针变量 pointTemp ,类型为 *int var pointTemp *int =temp fmt.Println(pointTemp) fmt.Println(*pointTemp)} //输出结果0xc00005a2d01 // 思考一下这行代码输出什么 fmt.Println(*&temp)
值传递和指针传递go语言函数调用时有两种传递方式一种是值传递函数
func ValueTransmit(){ temp := 1 fmt.Println(";value transmit before:",temp) method1(temp) fmt.Println("value transmit after:",temp) } func method1(temp int) { fmt.Println("method before:",temp) temp = 2 fmt.Println("method after;",temp) } //结果 value transmit before: 1 method1 before: 1 method1 after 2 value transmit after: 1 //从上边代码能够看出值传递是一种copy的方式,temp从ValueTransmit传递到method1(),是把temp从新copy了一份,methd1中修改temp是不会影响ValueTransmit中的temp
func PointTransmit(){ var temp = 1 fmt.Println("point transmit before:",temp) method2(&temp) fmt.Println("point transmit after",temp) } func method2(temp *int) { fmt.Println("method2 before:",*temp) *temp = 2 fmt.Println("method2 after:",*temp) } //结果 point transmit before: 1 method2 before: 1 method2 after 2 point transmit after: 2 //从上面的代码中能够看出指针传递后, 对指针所指向地址的值修改后,对其它方法是可见的
欢迎你们关注微信公众号:“golang那点事”,更多精彩期待你的到来学习