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

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

為什么函數執行后值會發生變化?

為什么函數執行后值會發生變化?

Go
慕標5832272 2023-04-24 16:03:57
我目前正在自學圍棋,但我無法理解某種行為:package mainimport (    "fmt")type List struct {    n int}func (l List) Increment() {    l.n += 1    l.LogState() // size: 1}func (l List) LogState() {    fmt.Printf("size: %v\n", l.n)}func main() {    list := List{}    list.Increment()    fmt.Println("----")    list.LogState() // size: 0}https://play.golang.org/p/-O24DiNPkxxLogState被執行兩次。最初,在Increment通話期間,它打印size: 1但Increment返回后打印size: 0。為什么這些值不同?
查看完整描述

2 回答

?
ITMISS

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

您的節點未添加到原始 linkedList 的原因是因為您沒有使用指向該結構的指針。因此,即使Increment示例代碼中的函數更改了值。結構的副本被更改,而不是實際的結構。

您可以使用指針接收器聲明方法。這意味著接收者類型對于某些類型 T 具有文字語法 *T。(此外,T 本身不能是指針,例如 *int。)

如果您想更改 linkedlistNode 結構計數器以顯示添加到列表中的節點,您應該在兩種方法上使用指針類型接收器來修改鏈表:

func?(l?*LinkedList)?AddInitialValue(v?interface{})
func?(l?*LinkedList)?LogState()

并在 main 內部將地址傳遞給 linkedList 以將這些指針類型接收器用作:

func?main()?{
????list?:=??&LinkedList{}
????list.AddInitialValue(9)

????fmt.Println("----")
????list.LogState()?//?size:?0
????}

筆記:-

使用指針接收器有兩個原因。

  • 修改其接收者指向的值。

  • 避免在每次方法調用時復制值。如果接收者是一個大結構,這會更有效


查看完整回答
反對 回復 2023-04-24
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

使用IncrementLogState定義了您定義它們的方式,您只使用的值的副本List。這意味著如果您在函數內部進行一些更改,它們僅在的函數范圍Increment內可見,并且僅在該特定范圍存在的其余部分可見。Increment要確認您始終使用初始值的副本List,您可以&list在執行Increment函數之前和&l在同一函數內部進行記錄。

如果你想讓更改永久化,你應該使用指向內存地址的指針。這意味著你的函數應該這樣定義:

func (l *List) Increment()
func (l *List) LogState()

這樣,您將傳遞一個內存引用(指向內存中地址的指針),并且每次更改 的值時l,您都會在傳遞的內存引用上更改它,并且它會在任何地方反映出來。


查看完整回答
反對 回復 2023-04-24
  • 2 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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