Hi,你们好。git
我是明哥,在本身学习 Golang 的这段时间里,我写了详细的学习笔记放在个人我的微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,所以写的东西应该会比较适合刚接触的同窗,若是你也是刚学习 Go 语言,不防关注一下,一块儿学习,一块儿成长。程序员
个人在线博客:golang.iswbm.com 个人 Github:github.com/iswbm/GolangCodingTimegithub
当咱们定义一个变量 namegolang
var name string = "Go编程时光"复制代码
此时,name 是变量名,它只是编程语言中方便程序员编写和理解代码的一个标签。编程
当咱们访问这个标签时,机算机会返回给咱们它指向的内存地址里存储的值:Go编程时光
。数组
出于某些须要,咱们会将这个内存地址赋值给另外一个变量名,一般叫作 ptr(pointer的简写),而这个变量,咱们称之为指针变量。微信
换句话说,指针变量(一个标签)的值是指针,也就是内存地址。编程语言
根据变量指向的值,是不是内存地址,我把变量分为两种:函数
指针建立有三种方法学习
第一种方法
先定义对应的变量,再经过变量取得内存地址,建立指针
// 定义普通变量
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("astr 指针类型是:%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 指针类型是:*float64复制代码
因此若咱们定义一个只接收指针类型的参数的函数,能够这么写
func mytest(ptr *int) {
fmt.Println(*ptr)
}复制代码
当指针声明后,没有进行初始化,其零值是 nil。
func main() {
a := 25
var b *int // 声明一个指针
if b == nil {
fmt.Println(b)
b = &a // 初始化:将a的内存地址给b
fmt.Println(b)
}
}复制代码
输出以下
<nil>
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, 90, 91}
modify(&a)
fmt.Println(a)
}复制代码
系列导读
24. 超详细解读 Go Modules 前世此生及入门使用