Golang 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
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语言中结构体调用方法的基本写法。