1.方法:
//定义一个结构体类型
type Person struct {
name string
age int
height float32
}
//定义一个方法和结构体绑定在一起
func (Person)say() {
fmt.Println("我是一个方法")
}
//定义一个方法和结构体绑定在一起
//func (student Person)say() {
//
// fmt.Println(student.name,student.age,student.height)
//}
// 3.既然可以把接收者看做是一个形参, 那么就存储值传递和地址传递的问题
func (student Person)setName(name string) {
student.name = name
}
func (student *Person)setAge(age int) {
(*student).age = age
}
func main() {
//定义一个结构体变量
var student Person = Person{"张三",20,170}
//结构体调用方法
student.say()
//值传递
student.setName("李四")
//打印结构体
fmt.Println(student)//{张三 20 170}
//地址传递
student.setAge(30)
//打印结构体
fmt.Println(student)//{张三 30 170}
}
复制代码
总结:
1.什么是Go语言的方法?
Go语言的方法就是一个特殊的函数, 函数是独立存在的, 而方法是和某种数据类型绑定在一起的
2.如何将一个函数和某种数据类型绑定在一起?
如下格式的含义就是将某个函数和接收者类型绑定在一起
func (接收者名称 接收者类型)函数名称(形参列表)(返回值列表){
逻辑语句;
}
3.Go语言中的函数可以和任何类型绑定, 但是一般用于和结构体绑定
注意点:
1.方法和函数的区别在于, 函数可以直接调用(通过包名.函数名称), 而方法只能通过绑定的数据类型对应的变量来调用(变量.函数名称)
2.函数名称和方法名称可以重名复制代码
方法和函数的异同:
type Person struct {
name string
age int
}
// 1.定义一个方法
func (Person) say() {
fmt.Println("Method say hello")
}
// 3.既然可以把接收者看做是一个形参, 那么就存储值传递和地址传递的问题
// 值传递
func (per Person) setName(name string) {
per.name = name
}
// 地址传递
func (per *Person) setAge(age int) {
(*per).age = age
}
func test() {
fmt.Println("test")
}
func main() {
/*
1.方法和函数的异同
1.1方法和函数都是 函数类型
1.2函数通过 包名.函数名称() 调用 / 方法通过 变量.方法名称() 调用
1.3方法的接手者可以看做是函数的一个形参, 会将调用者传递给接收者
接收者和函数形参一样, 也区分值传递和地址传递
到底是值传递还是地址传递, 和函数的形参一样
注意点:
接收者地址传递的两种方式
(*指针变量名).方法名称()
普通变量名.方法名称()
只要接收者是指针类型, 那么编译器就会自动将普通变量的地址取出来传递给接收者
*/
// 1.方法和函数都是 函数类型
/*
p := Person{"lnj", 33}
//fmt.Printf("say = %T\n", p.say) // func()
//fmt.Printf("test = %T\n", test) // func()
// 既然方法和函数都是函数类型, 所以可以定义变量保存函数, 也可以保存方法
// 定义一个用于保存没有形参没有返回值的函数类型变量
var fn func()
fn = test
fn()
fn = p.say
fn()
*/
// 3.值传递和地址传递
per := Person{"lnj", 33}
//per.setName("zs")
//p := &per
//(*p).setAge(666)
per.setAge(666) // 底层相当于(&per).setAge(666)
fmt.Println(per)
}复制代码