Golang的指针需要各种操作

你好,我是@nomurakkooo。
这次我在学习Go的过程中稍微查了一下指针,所以写下来了。
我是初学者级别的,还请多多指教。

指针是什么?

在Go或C等程序语言中常见的*和&符号,用于引用变量的地址以获取或更新其值。如果有错误,请温柔地指正我。

你称之为什么

简单来说,*是对变量地址内容的引用,&是对变量地址的访问。

对于&,我一时想不到一个合适的比喻。如果你有类似的例子或者觉得另一种方式更好,一定告诉我。

舉個簡單的例子。

1: package main
2:
3: import "fmt"
4:
5: func main() {
6:     var pointer *string
7:     var name string = "nomurakkooo"
8:
9:     pointer = &name
10:
11:    fmt.Println("&name: ", &name)
12:    fmt.Println("pointer: ", pointer)
13:    fmt.Println("name: ", name)
14:    fmt.Println("*pointer: ", *pointer) 
15: }
&name:  0xc42007e050
pointer:  0xc42007e050
name:  nomurakkooo
*pointer:  nomurakkooo

为什么要使用呢?

为何需要使用呢?

为什么要用呢?

在将参数传递给函数时,它实际上是传递的所有内容的副本。

当你想要在函数内更新作为参数传递的值,或者当参数太大而不想进行复制时,可以使用这个。

顺便提一下,把副本传递给其他变量意味着引用变量的地址已经发生了变化。正因为有了变化,才导致原始值无法被更新。

关于将指针传递给函数

这也与前面提到的“为什么使用”相关联。通过使用指针将参数传递,可以共享参考地址和值。

试着简单地递给我一下。

1: package main
2:
3: import "fmt"
4:
5: type Nomurakkooo struct {
6:   first  string
7:   last string
8: }
9:
10: func updateName(name *Nomurakkooo) {
11:  name.first = "nomurakkooo"
12:  name.last = "rakko"
13:
14:  fmt.Println("関数内:", name.first, name.last)
15: }
16:
17: func main() {
18:  fullName := Nomurakkooo{first: "nomura", last: "kouta"}
19:
20:  fmt.Println("更新前:", fullName)
21:
22:  updateName(&fullName)
23:
24:  fmt.Println("更新後:", fullName)
25: }
更新前: {nomura kouta}
関数内: nomurakkooo rakko
更新後: {nomurakkooo rakko}

对于结构体的情况,我想在第11行和第12行里(*name).first这样指定属性的方式不太好,但好像也可以用name.first来指定。关于对地址的引用方式,加上*统一一下会传达一种更好的感觉,但实际效果如何呢?

如果有人理解的话,我会很感激他们能够教给我。

总结

因为有可能会弄错记住了,所以要小心!

广告
将在 10 秒后关闭
bannerAds