go細節
- 一、使用指針接受者和不使用指針接受者
- 1,不使用指針接受者:
- 2,使用指針接受者
- 3,區別與優劣勢
一、使用指針接受者和不使用指針接受者
1,不使用指針接受者:
func (d dog) move() {fmt.Println("狗會動")
}
func main() {var x Movervar wangcai = dog{} // 旺財是dog類型x = wangcai // x可以接收dog類型var fugui = &dog{} // 富貴是*dog類型x = fugui // x可以接收*dog類型x.move()
}
- move 方法使用了值接收者 dog,這意味著它可以被任何 dog 類型的實例調用。
- 在 main 函數中,x 可以接收 dog 類型的值,也可以接收 *dog 類型的指針。然而,在將 wangcai 賦值給 x 時,Go 會自動進行值到指針的轉換,因此這里的代碼仍然可以編譯通過。
2,使用指針接受者
func (d *dog) move() {fmt.Println("狗會動")
}
func main() {var x Movervar wangcai = dog{} // 旺財是dog類型x = wangcai // x不可以接收dog類型var fugui = &dog{} // 富貴是*dog類型x = fugui // x可以接收*dog類型
}
- move 方法使用了指針接收者 *dog,這意味著它只能被 *dog 類型的指針調用。
- 在 main 函數中,將 wangcai 賦值給 x 就會導致編譯錯誤,因為 wangcai 是一個 dog 類型的值,而 x 要求接收 *dog 類型的指針。只有當將 fugui 賦值給 x 時,代碼才能編譯通過。
3,區別與優劣勢
-
調用方式不同:
值接收者方法可以被實例值調用,也可以被指針調用,而指針接收者方法只能被指針調用。
值接收者方法在調用時會隱式地將實例值復制一份,而指針接收者方法在調用時操作的是同一個實例,不會產生副本。 -
修改對象:
使用指針接收者方法可以修改對象的狀態,因為它們直接操作實例,而值接收者方法只能修改副本的狀態,不會影響原始實例。 -
性能和開銷:
值接收者方法會產生一份實例的拷貝,可能導致內存和性能開銷。
指針接收者方法直接操作實例,避免了拷貝,通常更高效。
選擇使用哪種接收者取決于你的需求和設計目標: -
如果方法需要修改對象的狀態或者需要操作對象的指針,使用指針接收者。
如果方法不需要修改對象狀態,使用值接收者,這樣可以避免不必要的指針操作和副本創建。