2 回答
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
????}筆記:-
使用指針接收器有兩個原因。
修改其接收者指向的值。
避免在每次方法調用時復制值。如果接收者是一個大結構,這會更有效
TA貢獻1735條經驗 獲得超5個贊
使用Increment并LogState定義了您定義它們的方式,您只使用的值的副本List。這意味著如果您在函數內部進行一些更改,它們僅在的函數范圍Increment內可見,并且僅在該特定范圍存在的其余部分可見。Increment要確認您始終使用初始值的副本List,您可以&list在執行Increment函數之前和&l在同一函數內部進行記錄。
如果你想讓更改永久化,你應該使用指向內存地址的指針。這意味著你的函數應該這樣定義:
func (l *List) Increment() func (l *List) LogState()
這樣,您將傳遞一個內存引用(指向內存中地址的指針),并且每次更改 的值時l,您都會在傳遞的內存引用上更改它,并且它會在任何地方反映出來。
- 2 回答
- 0 關注
- 178 瀏覽
添加回答
舉報
