Go:类型指针

6

教程中写道:

类型*T是指向T值的指针。 &运算符生成指向其操作数的指针。

我正在尝试使用Go中的指针,并编写了以下内容:

example := 42

p:=&example
fmt.Println(reflect.TypeOf(&p)) // **int
fmt.Println(reflect.TypeOf(*p)) // int

如果我理解正确,&p是指向一个int值的指针的指针。

指针内存图

在Go语言中,**Type有什么用途?


就像使用 *T 一样,您可以通过将 &p 传递给一个函数来更改 p 的值,该函数然后更改指向的值。 - mkopriva
Go语言中的**Type有什么用途?与C或其他带指针的语言相同,例如在链表中进行删除操作。 - Volker
2
问题“Go语言中Type的用途是什么?”太过宽泛。简单的答案是每当它有用时都可以使用。@Volker给出了一个例子。 - peterSO
3个回答

4
以下是关于指针链的简单演示:

在这里,我们使用指针链的概念来进行演示:

package main

import "fmt"

func main() {
    i := 42
    fmt.Printf("i: %[1]T %[1]d\n", i)
    p := &i
    fmt.Printf("p: %[1]T %[1]p\n", p)
    j := *p
    fmt.Printf("j: %[1]T %[1]d\n", j)
    q := &p
    fmt.Printf("q: %[1]T %[1]p\n", q)
    k := **q
    fmt.Printf("k: %[1]T %[1]d\n", k)
}

Playground: https://play.golang.org/p/WL2M1jp1T3

输出:

i: int 42
p: *int 0x10410020
j: int 42
q: **int 0x1040c130
k: int 42

2

是的,你理解得很正确。

至于“有什么用”,它与其他地方一样:在以下情况下使用指针:

  • 某个变量必须在其他代码中(通常是另一个函数)更改, 因此将指向该变量所占用内存的指针传递给该函数,以便该函数能够通过该地址更新该内存。

  • 一个值太大,无法通过复制来快速传递。

对于Go而言,指向指针的指针有点病态,但在第一种情况下可以使用:当您希望某个函数更改由您的代码控制的指针变量的值时。


2
指针允许您传递内存地址,以便多个作用域可以使用相同的地址,并且您可以更改该地址上的值而不更改地址;有效地允许您共享内存。指向指针的指针允许您传递内存地址的地址,以便多个作用域可以使用它,并且您可以更改由共享引用指向的地址。使用普通指针,如果更改指针的地址,则其他任何在其他地方持有的指针副本都将“断开连接”-它们将不再指向相同的值。
例如,您可能有两个变量在单独的工作程序中进行操作,并且希望能够在它们之间来回切换的中央引用。指向指针的指针是实现此目的的一种方式;中央引用可以更改为指向任何工作程序使用的指针。每个工作程序都将持有指向其通常会操作的值的指针,而无需知道中央引用是否指向其指针。
或者,正如@Volker所指出的,链表的规范示例。这里是C语言的一个示例,但Go语言中的指针逻辑是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接