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

发布于 1周前 作者 htzhanglong 来自 Go语言

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

无意间发现的一个写法

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 的话,这种写法似乎可以实现类似调用静态方法的写法?

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


更多关于Golang Go语言中结构体调用方法的写法是怎么回事?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

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)

更多关于Golang Go语言中结构体调用方法的写法是怎么回事?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Python 和 rust 都是这样

方法本来就是一个函数,这个函数的第一个参数就是 receiver,所以可以用这个方式调用

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

虽然能跑,但是这种写法不太正规。
t := T.NewT(T{},999)
这句的 T{}创建了一个新对象,以传值方式传给 NewT 函数。然后 NewT 函数完全没用到传进来的这个对象,
而是在 return 的时候又创建了一个新的对象 T{t: tValue},
然后回到 main()函数,它又以复制的方式赋给 t 变量(这又是另一个对象)

如果 receiver 是 T,那调用的时候,就是复制再传参的。所有参数都是复制再传递的。不要以为用对象调用方法,就不会复制。T 和*T 两种 receiver 是有区别的

调用 type.method 实际上就是把 method 的 receiver 暴露为参数了
一般就这两种:
1. type.method(type{},…)
2. (*type).method(new(type),…)
看 method 怎么的定义了

我的答案你没看懂。不过谢谢您的补充。

在Golang(Go语言)中,结构体调用方法的写法是面向对象编程(OOP)的一个核心部分。在Go中,虽然没有传统意义上的类和继承,但结构体(struct)和方法(method)的组合提供了类似的功能。

首先,定义一个结构体类型,例如:

type Person struct {
    Name string
    Age  int
}

然后,可以为这个结构体定义一个方法。方法的定义与普通函数类似,但接收者(receiver)必须是结构体的实例。接收者可以是值接收者或指针接收者。使用值接收者时,方法内部操作的是接收者的副本;而使用指针接收者时,操作的是原结构体实例。

例如,定义一个方法打印人的信息:

func (p Person) PrintInfo() {
    fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}

或者使用指针接收者:

func (p *Person) IncrementAge() {
    p.Age++
}

调用方法时,通过结构体的实例来调用:

person := Person{Name: "Alice", Age: 30}
person.PrintInfo()  // 输出: Name: Alice, Age: 30
person.IncrementAge()
person.PrintInfo()  // 输出: Name: Alice, Age: 31

注意,如果方法修改了结构体的字段,通常应使用指针接收者,以避免不必要的复制。这是Go语言中结构体调用方法的基本写法。

回到顶部