2 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的節(jié)點(diǎn)未添加到原始 linkedList 的原因是因?yàn)槟鷽]有使用指向該結(jié)構(gòu)的指針。因此,即使Increment
示例代碼中的函數(shù)更改了值。結(jié)構(gòu)的副本被更改,而不是實(shí)際的結(jié)構(gòu)。
您可以使用指針接收器聲明方法。這意味著接收者類型對(duì)于某些類型 T 具有文字語法 *T。(此外,T 本身不能是指針,例如 *int。)
如果您想更改 linkedlistNode 結(jié)構(gòu)計(jì)數(shù)器以顯示添加到列表中的節(jié)點(diǎn),您應(yīng)該在兩種方法上使用指針類型接收器來修改鏈表:
func?(l?*LinkedList)?AddInitialValue(v?interface{}) func?(l?*LinkedList)?LogState()
并在 main 內(nèi)部將地址傳遞給 linkedList 以將這些指針類型接收器用作:
func?main()?{ ????list?:=??&LinkedList{} ????list.AddInitialValue(9) ????fmt.Println("----") ????list.LogState()?//?size:?0 ????}
筆記:-
使用指針接收器有兩個(gè)原因。
修改其接收者指向的值。
避免在每次方法調(diào)用時(shí)復(fù)制值。如果接收者是一個(gè)大結(jié)構(gòu),這會(huì)更有效

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用Increment
并LogState
定義了您定義它們的方式,您只使用的值的副本List
。這意味著如果您在函數(shù)內(nèi)部進(jìn)行一些更改,它們僅在的函數(shù)范圍Increment
內(nèi)可見,并且僅在該特定范圍存在的其余部分可見。Increment
要確認(rèn)您始終使用初始值的副本List
,您可以&list
在執(zhí)行Increment
函數(shù)之前和&l
在同一函數(shù)內(nèi)部進(jìn)行記錄。
如果你想讓更改永久化,你應(yīng)該使用指向內(nèi)存地址的指針。這意味著你的函數(shù)應(yīng)該這樣定義:
func (l *List) Increment() func (l *List) LogState()
這樣,您將傳遞一個(gè)內(nèi)存引用(指向內(nèi)存中地址的指針),并且每次更改 的值時(shí)l
,您都會(huì)在傳遞的內(nèi)存引用上更改它,并且它會(huì)在任何地方反映出來。
- 2 回答
- 0 關(guān)注
- 175 瀏覽
添加回答
舉報(bào)