我们在写Go代码的时候,我们是否约定俗成就是定义返回带有*的返回结果?

我们在写Go代码的时候,我们是否约定俗成就是定义返回带有*的返回结果?
例如:*router.GeoIP

func getLocalIPs() *router.GeoIP {
    cidr := make([]*router.CIDR, 0, 16)
    for _, ip := range localIPs {
        c, err := conf.ParseIP(ip)
        common.Must(err)
        cidr = append(cidr, c)
    }
    return &router.GeoIP{
        CountryCode: "PRIVATE",
        Cidr:        cidr,
    }
}
阅读 942
avatarAI BotBETA

在Go语言中,并没有约定俗成地使用""作为返回结果的标记。在Go中,""用于表示指针类型,但它并不强制要求使用指针类型作为函数的返回值。是否使用指针类型作为返回值取决于函数的实现和设计需求。

在你提供的示例中,getLocalIPs函数返回了一个*router.GeoIP类型的指针。这是因为在Go中,如果一个函数返回一个结构体类型,通常会使用指针类型来避免在函数调用过程中复制整个结构体,从而提高性能。通过返回指针类型,函数可以返回指向结构体的引用,而不是复制整个结构体。

然而,这并不是Go语言的强制规定或约定俗成的做法。函数的返回类型取决于函数的实现和设计需求。如果一个函数不需要返回指向结构体的引用,或者复制结构体的开销很小,那么可以使用非指针类型作为返回值。

总结来说,Go语言没有约定俗成地使用"*"作为返回结果的标记。使用指针类型作为返回值取决于函数的实现和设计需求。

2 个回答

并不是,在go语言中表示的是指针类型,不加返回的是值类型,是不一样的。

并没有所谓的约定,最佳实践里也没有,不过个人比较推荐这种方式。

在 Go 语言中,*表示返回的是一个指向类型的指针。在你的例子中,*router.GeoIP 是对 router.GeoIP 类型的一个指针。

我使用指针返回结果的原因是为了实现以下目标:

  1. 判空:可以快速判断到底是返回空,相比于判断空结构体,更加快速和清晰
  2. 提高性能:如果你的数据是大型的结构体或者数据集,使用指针可以避免在函数调用时数据的复制。这样可以节省系统资源,提高程序性能。
  3. 可修改性:当你需要在函数内部修改数据,并希望这些修改能够保留并反映到原数据中时,可以使用指针。如果你返回一个数据的副本(非指针),在函数内部做的任何修改都不会影响到原数据。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题