go - 为什么指针在这个 Go 程序中失去了它的值(value)

标签 go

我不明白为什么指针 snil 即使在 input() 方法初始化它之后。有什么想法吗?

package main

import "fmt"


type ps string

func(s *ps)input(){
    x := ps("a")
    s = &x
}
func(s *ps)output(){

}

func main() {
    var v *ps
    v.input()
    if v == nil{
        fmt.Println("v shouldn't be nil")
    }
}

Playground http://play.golang.org/p/jU2hoMP7TS

最佳答案

你需要做两件事——main 需要为 input 可以写入的 ps 分配空间,你可以通过替换var v *psv := new(ps)。该字符串将是 "",但它是什么并不重要,只要在内存中为 string header 留出空间即可。 input 可以写入。正如 Momer 所说,otherwise the pointer's nil并且您的程序在尝试取消引用它时会发生 panic 。

为了通过指针赋值,input需要使用*s = x。由于 *s 是非正式的“获取 s 指向的内容”,您可以将其理解为“将 s 指向的内容更改为 x”。通常,围绕点运算符和方法调用的自动引用/取消引用行为可以避免这种情况,但是当您通过指针类型分配或执行其他操作(算术、索引等)时,代码中需要取消引用。

关于go - 为什么指针在这个 Go 程序中失去了它的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349731/

相关文章:

database - Golang 代码的运行速度真的比 PHP 中的相同代码慢

go - 嵌入结构以覆盖方法

Golang 等效于 npm 链接

windows - 无法在 Go 中编译测试程序

golang 将 map[string]interface{} 解码为包含元数组的结构

go - os.Open() 打开的文件是否需要 Close()?

go - 时间包中的 "Handy time stamps"是做什么用的?

go - 为什么我的 GOPATH/src 刚安装后包含几个目录?

go - 如何处理sql请求中的错误

go - 使用 SQL 驱动程序交叉编译 Go 程序