// php里面有& 号,就是引用的意思
// go 里面到处是*号,一定要搞懂他。
x := 1
p := &x
// 注意这里p就是指针
// 打印指针 他是类似 0xc0000b4008 的值, 他其实是一个地址,
// 程序里并没有必要直接操作 p, 他是一个地址, 他的值其实没什么意义
fmt.Printf("%v \n", p) // 0xc0000b4008
fmt.Printf("%v \n ", x)
// 指针的意义是, 在不知道变量名称的情况下, 利用指针, 直接控制变量。
// 我这段代码的意思是想说
// *p 就是 x
var c bool = false
c = *p == x
fmt.Printf("%t \n", c)
// 这里, 直接对指针
// 前面必须加*号
// 确切的说,是对 *p 的操作
// 就是直接对 x 的操作
// 记住 &号是取地址操作符, * 是操作指针引用的 变量(可以是很多类型)
*p = 8
fmt.Printf("%d \n", x)
下段代码很好理解, 每次初始赋值, 打印的指针值都不一样
var p = f()
func f() *int{
v := 1
return &v
}
func main() {
for i := 1; i<10; i++ {
fmt.Printf("%v \n", f())
}
}
但是注意,你要是打印p,地址就是一样的,
因为函数申请了一块空间,这个函数的指针是不会变得
这段代码看下
func incr(p *int) int {
*p++
return *p
}
func main() {
fmt.Printf("pp \n")
v := 1
incr(&v)
fmt.Println(v)
fmt.Printf("pp \n")
fmt.Println(incr(&v))
}
看完这段我炸了. *号 &号搞懂了, 会比较容易看懂,但在php里面
function incr(&$p) {
return $p++
}
使用的时候
incr($a)
和go语言代码功能一模一样。
php 果然是世界上最好的语言。 看下go简化后代码
func incr(p *int) int {
*p++
return *p
}
你直接return *p++会报错。
v := 1
incr(&v)
这里&v必须声明初始化,否则报错.
这是最简单写法了。
再理解下
x := 1
fmt.Printf("%d \n",x)
fmt.Printf("%v \n", &x)
fmt.Printf("%d \n", *&x)
你直接 *x是会报错的, 注意 x , x 一定是个引用,就是一个地址,就是指针。 所以以后看到x, 其实把它看成一个变量就好, *x就是变量别名, x其实是指针, x就是那个内存地址。
虽然写了十年代码了,但我还是菜鸟. 下面是我设想一下指针再go里面的意义。 万事万物都付给一个变量,或方法,或类, 直接操作这个值不就可以了吗? *x有啥意义呢?
事实上, 在底层语言中, 好多资源并没有变量。我尝试画了个图。
image.png
大概是这意思吧, go中好多时候没有x的别名,去操作4 ,那块内存资源。
这就是指针的意义。
网友评论