指针也是一个变量,但它存储的数据不是一个普通的值,而是另一个变量的内存地址。
var p int = 10
fmt.Printf("p的值:%v p的类型%T p的地址%p", p, p, &p)
//p的值:10 p的类型int p的地址0xc420010050
var a = 10
var p = &a
fmt.Printf("a的值:%v a的类型%T a的地址%p\n", a, a, &a)
fmt.Printf("p的值:%v p的类型%T p的地址%p", p, p, &p)
//a的值:10 a的类型int a的地址0xc420010050
//p的值:0xc420010050 p的类型*int p的地址0xc42000c030
Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如int、int64、*string等。
- 取变量指针的语法
ptr := &v
其中:v代表被取地址的变量,类型为T
ptr:用于接受地址的变量,ptr的类型就为*T,称做T的指针类型。
- demo1
a := 10
p := &a
fmt.Println(p,*p)//a的地址,10
*p = 30
fmt.Println(a)//30
- demo2
func fn1(x int) {
x = 10
}
func fn2(x *int) {
*x = 40
}
func main() {
var a = 5
fn1(a)
fmt.Println(a)//5
fn2(&a)
fmt.Println(a)//40
}
- 引用数据类型必须要先创建内存空间
错误案例
var userInfo = map[string]string
userInfo["username"]="zhangsan"
fmt.Println(userInfo)//type map[string]string is not an expression
正确写法
var userInfo = make(map[string]string)
userInfo["username"] = "张三"
fmt.Println(userInfo)//map[username:张三]
切片同理
var a []int
a[0] = 1
fmt.Println(a)
//panic:runtime error:index out of range [0] with length 0
正确写法
var a = make([]int, 4, 4)
a[0] = 1
fmt.Println(a) //[1 0 0 0]
指针同理
var a *int
*a = 100
fmt.Println(*a)
//panic: runtime error: invalid memory address or nil pointer dereference
正确写法
var a = new(int)
//a是一个指针变量,*int的指针类型,值为0
fmt.Printf("值:%v 类型:%T 指针变量对应的值:%v",a,a,*a)
//值:0xc420010050 类型:*int 指针变量对应的值:0
var b *int
b = new(int)
*b = 100
fmt.Println(*b)//100
new方法给指针变量分配存储空间(很少用)
- new与make的区别
make只用于slice、map以及channel(通道)的初始化,返回的还是这三个引用类型本身
new用于类型的内存分配,返回的是指向类型的指针。
网友评论