1 回答

TA貢獻1829條經驗 獲得超4個贊
您的“No.1”方法附加到一個nil切片,該切片保證如果提供的參數超過零,則將分配一個新的支持數組。
您的“No.2”方法不會創建新切片,它只是切片參數。
如果Assign()通過傳遞現有切片來調用,則第二種方法將存儲它,如果其元素被修改,它將反映在存儲的切片中。
讓我們稍微修改一下您的示例以對其進行測試:
type T1 struct {
local []string
}
func (t *T1) Assign1(param ...string) {
t.local = nil
t.local = append(t.local, param...) // No.1 <<<
}
func (t *T1) Assign2(param ...string) {
t.local = nil
t.local = param[:] // No.2 <<<
}
測試它:
t1 := &T1{}
s := []string{"a", "b", "c"}
t1.Assign1(s...)
fmt.Println(t1.local)
s[0] = "x"
fmt.Println(t1.local)
s = []string{"a", "b", "c"}
t1.Assign2(s...)
fmt.Println(t1.local)
s[0] = "x"
fmt.Println(t1.local)
輸出(在Go Playground上試試):
[a b c]
[a b c]
[a b c]
[x b c]
如您所見,使用 時Assing1(),local修改傳遞的切片不會影響切片。
使用 時Assing2(),切片的元素local反映了對原始元素所做的更改。
- 1 回答
- 0 關注
- 119 瀏覽
添加回答
舉報