Go 实例isn'上的字符串数组被替换;t反射

Go 实例isn'上的字符串数组被替换;t反射,go,Go,我有一个具有数组字段的结构实例。当goroutine替换实例上的数组时,该实例的所有其他句柄仍保留原始数组。为什么会这样?我应该更改什么,以便下面的容器的实例将反映在goroutine上所做的更改 这里还反映了一个简单的例子: 这是因为您正在使用切片的值。返回通过复制返回到main的切片的值。Goroutine然后执行并更新原始值。进行以下更改: func Create() *Container { // return a pointer to container // instanc

我有一个具有数组字段的结构实例。当goroutine替换实例上的数组时,该实例的所有其他句柄仍保留原始数组。为什么会这样?我应该更改什么,以便下面的
容器的实例将反映在goroutine上所做的更改

这里还反映了一个简单的例子:


这是因为您正在使用切片的值。返回通过复制返回到
main
的切片的值。Goroutine然后执行并更新原始值。进行以下更改:

func Create() *Container { // return a pointer to container

    // instance is now initialized and points to a Container value
    // (i.e. instance is of type *Container)
    instance := &Container{
        values: []string{"initial value"},
    }
    go func() {
        instance.values = []string{"modified value"}
        fmt.Print("values updated")
    }()
    return instance
}
既然main有一个指向上述
实例的指针
,那么goroutine所做的修改将是可见的

例如:

此外,要创建新值,可以直接使用类型的名称:

instance := Container{ // instance is of type Container
    // ...
}
要创建和初始化类型的指针,请使用:

instance := &Container{ // instance is of type *Container
    // ...
}
这样做是多余的:

instance := *&Container{ // instance is of type Container. Same as first declaration
    // ...
}
没有指向
容器的“句柄”(指针)
——您是按值返回结构,而不是指向它的指针。
instance := *&Container{ // instance is of type Container. Same as first declaration
    // ...
}