为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中分配给nil结构的字段

如何在golang中分配给nil结构的字段

Go
呼啦一阵风 2021-09-27 10:02:08
我正在尝试为字段赋值,但我的程序因runtime error: invalid memory address or nil pointer dereference.package maintype Node struct {    Value int}func (n *Node) SetValue(value int) {    n.Value = value}func main() {    var n *Node    n.SetValue(1)}这是合理的,因为变量为零。但是我发现一些 Go 内部结构允许这样做,例如bytes.Bufferpackage mainimport "bytes"import "io"import "os"func main() {    var b bytes.Buffer    b.Write([]byte("Hello world"))    io.Copy(os.Stdout, &b)}这是`bytes.Buffer源代码func (b *Buffer) Write(p []byte) (n int, err error) {    b.lastRead = opInvalid    m := b.grow(len(p))    return copy(b.buf[m:], p), nil}这是只有内置结构可以做的事情还是可以在我的代码中完成?编辑这是工作示例。感谢@twotwotwo 的建议。package mainimport "fmt"type Node struct {    Value int}func (n *Node) SetValue(value int) {    n.Value = value}func main() {    var n Node    n.SetValue(1)    fmt.Println(n.Value)}
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

关键是var b bytes.Buffer不给你一个nil指针,它给你一个bytes.Buffer对象,它的所有字段都用零值初始化(用机器术语来说,零字节)。规范说零值是“布尔值为假,整数为 0,浮点数为 0.0,字符串为“”,指针、函数、接口、切片、通道和映射为 nil”;点击该链接了解更多详情。

可以制作自己的零值结构体,并且Go 团队鼓励这样做struct Position { x, y int }是一个简单的例子,而 Effective Go 给出了一个更现实的例子。但请注意,这不会使nil 指针起作用;您仍然需要new(Node)var n Node分配零Node。对于bytes.Buffer.

零值的另一个常见用途:无论您的用户在何处直接创建您的类型的结构(就像人们所做的那样http.Server),零值是他们未指定的任何字段的默认值。这是许多其他地方的默认设置:如果您从关闭的频道接收到未找到的地图密钥,您可能会得到什么,可能还有其他地方。


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信