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

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

范圍的奇怪行為

范圍的奇怪行為

Go
慕尼黑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)}現在如果你運行它,你將得到如下結果:{[] [0 1 2 3 4 5 6 7 8 9]}這意味著該x1數組永遠不會被填充。或者實際上,它是,但每次s1函數退出時都會重置。s2將項目放入預定義的數組中效果很好。有誰知道這里到底發生了什么?是因為數組修改的范圍嗎?這似乎有點違反直覺。PS 我確實明白 x1 是一個切片,其中 x2 是一個實際的預定義數組。我自己的理論是,如果您使用“切片”,它們只能在特定范圍內更改,而不能在其他任何地方更改。
查看完整描述

1 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

值接收者制作類型的副本并將其傳遞給函數。

只需將其設置為指針即可:


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)

}


查看完整回答
反對 回復 2023-08-07
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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