go_细节注意

go细节

  • 一、使用指针接受者和不使用指针接受者
    • 1,不使用指针接受者:
    • 2,使用指针接受者
    • 3,区别与优劣势

一、使用指针接受者和不使用指针接受者

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,区别与优劣势

  • 调用方式不同:

    值接收者方法可以被实例值调用,也可以被指针调用,而指针接收者方法只能被指针调用。
    值接收者方法在调用时会隐式地将实例值复制一份,而指针接收者方法在调用时操作的是同一个实例,不会产生副本。

  • 修改对象:
    使用指针接收者方法可以修改对象的状态,因为它们直接操作实例,而值接收者方法只能修改副本的状态,不会影响原始实例。

  • 性能和开销:
    值接收者方法会产生一份实例的拷贝,可能导致内存和性能开销。
    指针接收者方法直接操作实例,避免了拷贝,通常更高效。
    选择使用哪种接收者取决于你的需求和设计目标:

  • 如果方法需要修改对象的状态或者需要操作对象的指针,使用指针接收者。
    如果方法不需要修改对象状态,使用值接收者,这样可以避免不必要的指针操作和副本创建。

你可能感兴趣的:(golang,开发语言,后端)