go细节
一、使用指针接受者和不使用指针接受者
1,不使用指针接受者:
func (d dog) move() {
    fmt.Println("狗会动")
}
func main() {
    var x Mover
    var 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 Mover
    var 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,区别与优劣势
-  调用方式不同: 值接收者方法可以被实例值调用,也可以被指针调用,而指针接收者方法只能被指针调用。 
 值接收者方法在调用时会隐式地将实例值复制一份,而指针接收者方法在调用时操作的是同一个实例,不会产生副本。
-  修改对象: 
 使用指针接收者方法可以修改对象的状态,因为它们直接操作实例,而值接收者方法只能修改副本的状态,不会影响原始实例。
-  性能和开销: 
 值接收者方法会产生一份实例的拷贝,可能导致内存和性能开销。
 指针接收者方法直接操作实例,避免了拷贝,通常更高效。
 选择使用哪种接收者取决于你的需求和设计目标:
-  如果方法需要修改对象的状态或者需要操作对象的指针,使用指针接收者。 
 如果方法不需要修改对象状态,使用值接收者,这样可以避免不必要的指针操作和副本创建。









