登录
首页 >  Golang >  Go问答

去吧,如果我用仅类型接收器声明一个函数,如何调用它?

来源:stackoverflow

时间:2024-04-02 10:00:36 184浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《去吧,如果我用仅类型接收器声明一个函数,如何调用它?》,聊聊,我们一起来看看吧!

问题内容

只是好奇,如果我仅使用类型接收器声明它,如何调用下面的 go func func (t) test() ,它是否有效?例如:https://play.golang.org/p/k8qukaczdun

package main

import (
    "fmt"
)

type t int

func (t) test() {
    fmt.println(233)
}

func main() {
    fmt.println(666666)
}

我尝试构建并运行它,看起来不错......但是:

  1. 这个 func (t) test() 到底是什么以及如何调用它?
  2. 这种声明有任何有意义的用例吗(我的意思是裸类型作为接收者)?

更多背景:

我被触发去思考这个问题,因为我想找到一种惯用/优雅的方式将枚举(iota)的所有值公开给外部包,目前我正在做类似的事情:https://play.golang.org /p/id0aq_mn2sj

package main

import (
    "fmt"
)

type Gender int

const (
    Male Gender = iota + 1
    Female
)

func (g Gender) All() [2]string {
    return [...]string{"MALE", "FEMALE"}
}

func main() {
    fmt.Println("All gender types:", Gender(0).All())
}

它有效,因此任何 gender 实例都可以调用其 all 函数来获取所有 gender 类型,但感觉有点奇怪,所以我开始考虑 是否可以仅在该类型上注册一个 func,不是实例,所以我可以这样做:package.gender.all(),在go中可能吗?

顺便说一句,没有全局变量。


正确答案


如您的示例所示,是的。

这是一个正常的方法。您可以像普通方法一样调用它。请参阅:

var val t
val.test()

这种形式的方法的主要区别是您无法访问接收器(因为它未命名)。所以它实际上类似于 "static" method(尽管实际上不是。您仍然需要一个实例来调用它)

如果您想获取枚举的所有值,则没有理由将其设为类型方法。它所做的只是创建一个额外的步骤来调用它:

var g Gender // create a useless variable so we can call the method
g.All() // actually call the method

你不妨为它创建一个常规函数。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《去吧,如果我用仅类型接收器声明一个函数,如何调用它?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>