我正在嘗試將值分配給在 init func 中初始化的映射。但是發生了恐慌:分配給 nil 映射中的條目package maintype Object interface { }type ObjectImpl struct {}type Test struct{ collection map[uint64] Object}func (test Test) init(){ test.collection = make(map[uint64] Object)}func main() { test := &Test{} test.init() test.collection[1]=&ObjectImpl{}}https://play.golang.org/p/yOwXzDkWIo
2 回答

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
該函數Test作為值,所以它得到它自己的副本。當函數返回時,所有更改test Test都將消失。取而代之Test的是:
func (test *Test) init(){
test.collection = make(map[uint64] Object)
}
但請注意,結構Test已導出,方法init未導出,因此您的庫的用戶可能會創建一個Test但不能正確初始化它。似乎圍棋社區已經建立了一種獨立NewType方法的約定:
type test struct{
collection map[uint64] Object
}
function NewTest() *test {
return &test{
collection: make(map[uint64] Object),
}
}
這確保了用戶只能test通過調用獲得 aNewTest并且它將按預期進行初始化

月關寶盒
TA貢獻1772條經驗 獲得超5個贊
您應該為該init方法使用指針接收器:
func (test *Test) init() { // use a pointer to test
test.collection = make(map[uint64] Object)
}
如果沒有指針,您正在為test對象的副本初始化映射。實際test對象永遠不會獲得初始化的地圖。
- 2 回答
- 0 關注
- 177 瀏覽
添加回答
舉報
0/150
提交
取消