请关注原做者公众号:Go编程时光程序员
当咱们定义一个变量 nameshell
var name string = "Go指针"
此时,name 是变量名,它只是编程语言中方便程序员编写和理解代码的一个标签。编程
当咱们访问这个标签时,计算机会返回给咱们它指向的内存地址里存储的值:Go指针
。数组
出于某些须要,咱们会将这个内存地址赋值给另外一个变量名,一般叫作prt(pointer的简写),而这个变量,咱们称之为指针变量。编程语言
换句话说,指针变量(一个标签)的值是指针,也就是内存地址。函数
根据变量指向的值,是不是内存地址,把变量分为两种:指针
指针建立有三种方法code
第一种方法
内存
先定义对应的变量,再经过变量取得内存地址,建立指针字符串
// 定义普通变量 aint := 1 // 定义指针变量 ptr := &aint
第二种方法
先建立指针,分配好内存后,在给指针指向的内存地址写入对应的值
// 建立指针 astr := new(string) // 给指针赋值 *astr = "Go指针"
第三种方法
先声明一个指针变量,再从其余变量取得内存地址赋值给它
aint := 1 var bint *int // 声明一个指针 bint = &aint
上面三段代码中,指针的操做都离不开这两个符号:
&
:从一个普通变量中取得内存地址*
:当*
在赋值操做值得右边,从一个指针变量中取得变量值,当*
在赋值操做值得左边,是指该指针指向的变量经过下面这段代码,你能够熟悉这两个符号的用法
package main import "fmt" func main(){ aint := 1 // 定义普通变量 ptr := &aint // 定义指针变量 fmt.Println("普通变量存储的是:",aint) fmt.Println("普通变量存储的是:",*ptr) fmt.Println("指针变量存储的是:",&aint) fmt.Println("指针变量存储的是:",ptr) }
输出以下
普通变量存储的是:1 普通变量存储的是:1 指针变量存储的是:0xc0000100a0 指针变量存储的是:0xc0000100a0
要想打印指针指向的内存地址,方法有两种
// 第一种 fmt.Printf("%p",ptr) //第二种 fmt.Println(ptr)
咱们知道字符串的类型是 string,整型是 int,那么指针如何表示呢?
package main import "fmt" func main() { astr := "hello" aint := 1 abool := false arune := 'a' afloat := 1.2 fmt.Printf("asgr 指针类型是:%T\n", &astr) fmt.Printf("aint 指针类型是:%T\n", &aint) fmt.Printf("abool 指针类型是:%T\n", &abool) fmt.Printf("arune 指针类型是:%T\n", &arune) fmt.Printf("afloat 指针类型是:%T\n", &afloat) }
输入以下,能够发现用 *
+ 所指向变量值的数据类型,就是对应的指针类型。
astr 指针类型是:*string aint 指针类型是:*int abool 指针类型是:*bool arune 指针类型是:*int32 afloat 指针类型是:*float
因此若咱们定义一个只接收指针类型的参数的函数,能够这么写
func mytest(ptr *int) { fmt.Println(*ptr) }
当指针声明后,没有进行初始化,其零值是 nil。
func main() { a := 25 var b *int // 声明一个指针 if b == nil { fmt.Println(b) // <nil> b = &a // 初始化:将a的内存地址给b fmt.Println(b) // 0xc0000100a0 } }
切片与指针同样,都是引用类型。
若是咱们想经过一个函数改变一个数组的值,有两种方法
尽管两者均可以实现咱们的目的,可是按照Go语言的使用习惯,建议使用第一种方法,由于第一种方法,写出来的代码更简洁,易懂。
使用切片
func modify(sls []int) { sls[0] = 90 } func main() { a := [3]int{89,90,91} modify(&a) fmt.Println(a) }
使用指针
func modify(arr *[3]int) { (*arr)[0] = 90 } func main() { a := [3]int{89,909,1} modify(&a) fmt.Println(a) }