玩转Go语言之方法

代码:github.com/codeXiaoQia…

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)
}复制代码


转载于:https://juejin.im/post/5bac5077e51d450e8b13cf13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值