Pointers 保存到结构本地指针

Pointers 保存到结构本地指针,pointers,go,Pointers,Go,为什么这个程序打印nil而不是hello?如何解决这种情况并成功地将指针存储在结构中?Go不应该知道本地指针何时在函数范围之外使用吗 package main import ( "fmt" ) type test struct { name *string } func (t test) test() { h := "hello" t.name = &h return } func main() {

为什么这个程序打印nil而不是hello?如何解决这种情况并成功地将指针存储在结构中?Go不应该知道本地指针何时在函数范围之外使用吗

package main

import (
    "fmt"
)

type test struct {
    name *string
}

func (t test) test() {
    h := "hello"
    t.name = &h
    return
}

func main() {
    a := test{nil}
    a.test()
    fmt.Println(a.name)
}

测试函数有一个值接收器。因此,测试将应用于a的副本。如果你想用一个方法改变一个结构,你应该写一个有指针接收器的方法。调用该方法时,go将自动使用该方法的引用

func (t *test) test() {
    h := "hello"
    t.name = &h
}

func t test是测试时的值接收器。这意味着该方法是在。该副本在函数调用期间设置了t.name,但是没有任何东西可以将其复制回a。改为使用指针接收器:func t*test test。指针接收器是否总是建议用于速度,或者对于只读方法,值接收器更适合?如果必须在方法中变异结构,请使用指针接收器。否则,坚持价值接受者。速度取决于代码在硬件上的工作方式。您可以编写一个简单的基准测试,以查看这两种方法的变化情况。还可以检查哪一种方法涵盖了您提出的要点。更正:否则请坚持使用值接收器,除非您的结构是海量的。您不希望不必要地创建海量结构的副本