亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在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 關注
  • 275 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號