如何分配给golang中的nil struct字段

如何分配给golang中的nil struct字段,go,Go,我试图给一个字段赋值,但我的程序由于运行时错误而陷入恐慌:无效的内存地址或零指针解引用 这是合理的,因为变量为零。 但我发现一些Go内部结构是允许这样做的,例如bytes.Buffer 这是“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), n

我试图给一个字段赋值,但我的程序由于运行时错误而陷入恐慌:无效的内存地址或零指针解引用

这是合理的,因为变量为零。 但我发现一些Go内部结构是允许这样做的,例如bytes.Buffer

这是“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
}
这是只有内置结构才能做的事情,还是可以在我的代码中实现这一点

编辑 下面是一个工作示例。谢谢@twoo2的建议

package main

import "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)
}
关键的是var b字节。Buffer不会给你一个nil指针,它会给你一个bytes。Buffer对象,它的所有字段都初始化为机器术语中的零值,零字节。布尔值为false,整数为0,浮点值为0.0,字符串为0,指针、函数、接口、切片、通道和映射为nil;请点击该链接了解更多详细信息

您可以创建自己的结构,使其零值可以正常工作。结构位置{x,y int}是一个简单的例子,有效的Go给出了一个更现实的例子。但是请注意,这并不能使nil指针工作;您仍然需要newNode或var n Node来分配零节点。对于bytes.Buffer也一样


零值的另一个常见用法是:无论用户在何处直接创建您类型的结构,比如说,对于他们未指定的任何字段,零值都是默认值。这是许多其他地方的默认设置:如果您从一个封闭的频道接收到消息,那么找不到地图键可以得到什么,可能还有其他地方。

没什么特别的;您可以在代码中执行此操作。诀窍是b不是指向bytes.Buffer的nil指针,它是一个bytes.Buffer结构,其所有字段最初都为零。但是我没有分配bytes.Buffer,也没有使用new关键字或struct literal。为什么是我初始化了字节。Buffer object.var T分配一个T:var*T不分配一个T。
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
}
package main

import "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)
}