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来指定。关于对地址的引用方式,加上*统一一下会传达一种更好的感觉,但实际效果如何呢?
如果有人理解的话,我会很感激他们能够教给我。
总结
因为有可能会弄错记住了,所以要小心!