Go語言方法可以接收值類型或指針類型參數,這直接影響方法的行為。本文將通過Person結構體及其Eat()方法的兩種接收器類型(Person和*Person)來闡述其差異。
代碼中定義的Person結構體包含姓名、年齡、性別和愛好等字段,以及兩個同名Eat()方法,分別使用值接收器和指針接收器。接收器類型決定了方法調用時的參數傳遞方式,進而影響方法內部對結構體屬性的修改。
james.Eat()的調用方式決定了哪個Eat()方法會被執行。由于james是Person類型的變量(值類型),編譯器會選擇接收器為Person的方法。如果james聲明為指針類型(james := &Person{}),則會調用接收器為*Person的方法。
立即學習“go語言免費學習筆記(深入)”;
關鍵區別在于:值接收器(Person)傳遞的是結構體的副本;指針接收器(*Person)傳遞的是結構體的指針。因此,使用值接收器時,方法內部對結構體屬性的修改不會影響原始變量james;而使用指針接收器時,修改會直接作用于james。
總結:
- 值接收器和指針接收器擁有不同的方法集(雖然方法名相同,但接收器類型不同,視為不同的方法)。
- 值接收器傳遞的是副本,修改不影響原變量;指針接收器傳遞的是指針,修改直接影響原變量。
理解這兩種接收器類型的差異,有助于開發者根據需求選擇合適的接收器類型,靈活控制結構體狀態。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦