通常而言,在go中,元素赋值一个变量A后,A变量如果在赋值给另外一个变量B,相当于一次复制。对于底层内存地址来讲,对于二次赋值的变量B修改元素,是不会修改到A变量的值,这是因为变量B的内存地址以及发生改变,如果需要修改到变量A,A就需要使用指针调用来赋值给B,大致意思是A和B使用同一个内存地址。
认识指针
通常变量存储在内存空间,如下图
A存储在2,而后赋值B=A
此刻,设置B赋值3,那么赋值是否对A有影响
package main
import "fmt"
func main(){
A := 2
B := A
B = 3
fmt.Printf("A:%d B:%d",A,B)
}
运行
[root@marksugar /opt/Golang]# go run zhizhen.go
A:2 B:3
上述A是2,B是3,说明赋值给B的3是没有影响到A的值,B是单独的一个值,如下:
如果我一定要通过赋值修改A的值,就可以使用指针来进行修改。
如上述中。假如,A赋值的2存储在内存中的地址编号是0DSA6W3
,此刻要修改就需要使用A存储的的内存地址进行修改。如下:
定义指针
使用&
符号取变量地址,而这个类型也是*int
,这个类型就是指针类型。
!!! 如果是一个字符串就是*string
,如果是bool就是*bool
,如果是浮点数就是*float64
.
我们定义一个C的指针
var C *int
简短声明
A := 2
B := A
B = 3
fmt.Printf("A:%d B:%dn",A,B)
C := &A
fmt.Printf("%T",C)
运行
[root@marksugar /opt/Golang]# go run zhizhen.go
A:2 B:3
*int
获取指针值
如果要获取指针的值就需要使用*变量。如:*c
A := 2
C := &A
fmt.Printf("%T %p",C,*C)
[root@marksugar /opt/Golang]# go run zhizhen.go
A:2 B:3
*int 2
修改指针值
A := 2
C := &A
*C = 666
fmt.Print(*C)
[root@marksugar /opt/Golang]# go run zhizhen.go
666
golang中的指针没有复杂的运算,相对来讲是安全的。
指针的应用
使用指针
package main
import "fmt"
func main(){
var name string
var age int
var height float64
fmt.Print("请输入你的名字: ")
fmt.Scan(&name)
fmt.Print("请输入你的年龄: ")
fmt.Scan(&age)
fmt.Print("请输入你的身高: ")
fmt.Scan(&height)
fmt.Printf("你输入的是名字是: [%s]n输入的年龄是: [%d]n输入的身高是: [%f]",name,age,height)
}
运行后输入:
[root@marksugar /opt/Golang]# go run zhizhen2.go
请输入你的名字: mark
请输入你的年龄: 18
请输入你的身高: 1.7
你输入的是名字是: [mark]
输入的年龄是: [18]
输入的身高是: [1.700000]
现在你必须按照类型输入。
!!! Warning
指针的空值是nil