Go 语言这种结构体调用方法的写法是怎么回事?

hakono:无意间发现的一个写法

type T struct {
	t int
}

func (t T) NewT(tValue int) T {
	return T{t: tValue}

}
func main() {
	t := T.NewT(T{},999)
	fmt.Println(t)
}


输出 {999}

没有结构体实例,但是却可以直接调用类型来调用对应的方法

t := T.NewT(T{},999)

这写法有点像调用静态方法

通过一些测试可以知道第一个参数的 T{} 必须存在,传入的第一个参数会被当成方法的 reciver 传入方法中(莫非 go 语言是通过这种机制实现的方法调用)
如果方法不去管传入的 reciver 的话,这种写法似乎可以实现类似调用静态方法的写法?

翻了下似乎没找到这种写法的说明,不知道官网有没有对应的地方介绍(也可能是我没找对地方)

cmdOptionKana:https://golang.org/ref/spec

That function may be called normally with an explicit receiver, so these five invocations are equivalent:
t.Mv(7)
T.Mv(t, 7)
(T).Mv(t, 7)
f1 := T.Mv; f1(t, 7)
f2 := (T).Mv; f2(t, 7)

SingeeKing:Python 和 rust 都是这样

Go 使用函数类型实现接口的方式,其它语言有类似的实践吗?

FutherAll:试了下 Swift 是不行,因为 Swift 需要显示的继承 protocol 才可以。 Python 可以吗?FutherAll:像 Go 的 http 的标准库 HandlerFunc 实现 Handler 接口这样![go.png]( https://s1.ax1x.com/2020/10/04/0Gai59.png)Swift 好…

学 GO 的一起交流

K120:对 Golang 感兴趣的小伙伴们加入进来一起学习,共同成长。 此贴不讨论任何内容,谢谢。 或者加我拉你进群。

求问 Go 设置结构体属性的样式

hjahgdthab750:实际在用的时候似乎有两种形式,但是不知道那种更优或者各自的场景 type A { X string B string } func (a *A) SetX (error) {} func (a A) GetX (string,error) {} func NewA() { a = A{} // 第一种 a.X,err = a.Ge…

Go 中怎么实现类似 Java 里的枚举类型?

woostundy:用定义常量来实现枚举类型,太简易了。没法通过值找到枚举名称,没法约束值范围,没法输出所有可选枚举值。 试过在自定义类型上面加 String(), All() 方法,但代码又多又丑陋。 有什么好的写法或者第三方包能实现吗?scnace:code generation (逃 lbp0200:直接复制粘贴了type Direction intc…

超火爆的 go 微服务框架推荐

kevinwan:go-zero 内置完整微服务治理能力,千万级日活实践检验,工具自动生成微服务,只需编写业务代码即可 开源一个月即获 1.3k stars 项目地址: https://github.com/tal-tech/go-zero 快速开始: https://github.com/tal-tech/go-zero/blob/master/doc/b…