我正在嘗試為字段賦值,但我的程序因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
),零值是他們未指定的任何字段的默認值。這是許多其他地方的默認設置:如果您從關閉的頻道接收到未找到的地圖密鑰,您可能會得到什么,可能還有其他地方。
- 1 回答
- 0 關注
- 275 瀏覽
添加回答
舉報
0/150
提交
取消