慕尼黑8549860
2023-08-07 15:19:52
考慮以下最小示例:package mainimport "fmt"type runner interface { s1(int) s2(int)}type test struct { x1 []int x2 []int}func (t test) s1(v int) { t.x1 = append(t.x1, v) t.s2(v)}func (t test) s2(v int) { t.x2[v] = v}func main() { t := test{ x1: make([]int, 0), x2: make([]int, 10)} for i := 0; i < 10; i++ { t.s1(i) } fmt.Println(t)}現(xiàn)在如果你運行它,你將得到如下結(jié)果:{[] [0 1 2 3 4 5 6 7 8 9]}這意味著該x1數(shù)組永遠不會被填充。或者實際上,它是,但每次s1函數(shù)退出時都會重置。s2將項目放入預(yù)定義的數(shù)組中效果很好。有誰知道這里到底發(fā)生了什么?是因為數(shù)組修改的范圍嗎?這似乎有點違反直覺。PS 我確實明白 x1 是一個切片,其中 x2 是一個實際的預(yù)定義數(shù)組。我自己的理論是,如果您使用“切片”,它們只能在特定范圍內(nèi)更改,而不能在其他任何地方更改。
1 回答

婷婷同學(xué)_
TA貢獻1844條經(jīng)驗 獲得超8個贊
值接收者制作類型的副本并將其傳遞給函數(shù)。
只需將其設(shè)置為指針即可:
func (t *test) s1(v int) {
t.x1 = append(t.x1, v)
t.s2(v)
}
輸出:
&{[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9]}
代碼:
package main
import "fmt"
type runner interface {
s1(int)
s2(int)
}
type test struct {
x1 []int
x2 []int
}
func (t *test) s1(v int) {
t.x1 = append(t.x1, v)
t.s2(v)
}
func (t test) s2(v int) {
t.x2[v] = v
}
func main() {
t := &test{
x1: make([]int, 0),
x2: make([]int, 10)}
for i := 0; i < 10; i++ {
t.s1(i)
}
fmt.Println(t)
}
- 1 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報
0/150
提交
取消