学习笔记根据 无闻 go语言基础教程 整理
method
- Go 中没有class, 但依旧有method
- 通过显式说明receier来实现与某个类型的组合
- 只能为同一个包中的类型定义方法
- Receiver可以是类型的值或指针
- 不存在方法重载
- 可以使用值或指针来调用方法,编译器会自动完成转换
- 从某种意义上来说,方法是函数的语法糖,因为reveiver其实就是方法所接收的第一个参数(Method Value vs. Method Expression)
- 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
- 类型别名不会拥有底层类型所附带的方法
- 方法可以调用结构中的非公开字段。
- 示例代码:
package main
import (
"fmt"
)
type A struct {
Name string
Age int
grade string
}
type TZ int
func main() {
test1()
test2()
test3()
test4()
test5()
test6()
}
func (a A) Print() {
fmt.Println("A")
}
func (a A) SetName() {
a.Name = "A"
}
func (a *A) SetAge() {
a.Age = 10
}
func (a *A) SetGrade() {
a.grade = "g3"
}
func (a *TZ) Print() {
fmt.Println("TZ")
}
func test1() {
a := A{}
a.Print()
}
func test2() {
a := A{}
a.SetName()
fmt.Println(a.Name)
}
func test3() {
a := A{}
a.SetAge()
fmt.Println(a.Age)
}
func test4() {
var a TZ
a.Print()
}
func test5() {
var a TZ
(*TZ).Print(&a)
}
func test6() {
a := A{}
(*A).SetGrade(&a)
fmt.Println(a.grade)
}