Go语言基础----方法值和方法表达式

Go语言基础----方法值和方法表达式

概念

  • 方法:是为特定类型定义的,只能由该类型调用的函数。
    定义:方法是添加了接收者的函数。接收者必须是自定义的 类型。
指针接收者
  • 该使用值接收者还是指针接收者,取决于是否现需要修改原始结构体。
  • 若不需要修改则使用值,若需要修改则使用指针。
  • 若存在指针接收者,则所有方法使用指针接收者。
命名嵌入
  • 若结构体匿名嵌入带有方法的结构体时,则在外部结构体可以调用嵌入结构体的方法,并且在调用时只有嵌入的字段会传递给嵌入结构体方法的接收者。
  • 当被嵌入结构体与嵌入结构体具有相同名称的方法时,则使用对象.方法名调用被嵌入结构体方法。若想要调用嵌入结构体方法,则使用对象.嵌入结构体名.方法

方法值

package main

import "fmt"

type Dog struct {
	name string
}

func (dog Dog) call() {
	fmt.Printf("%s: 汪汪\n", dog.name)
}

func (dog *Dog) setName(name string) {
	dog.name = name

}

func main() {
	dog := Dog{"皮皮"}
	m1 := dog.call //dog 拷贝
	fmt.Printf("%T\n", m1)
	m1()

	dog.setName("小黑")
	dog.call()
	m1()

	pdog := &Dog{"皮皮"}
	m2 := pdog.call //pdog会自动解引用,拷贝
	fmt.Printf("%T\n", m2)
	m2()

	pdog.setName("小黑")
	pdog.call()
	m2()
}

/*
func()
小黑: 汪汪
皮皮: 汪汪
func()
皮皮: 汪汪
小黑: 汪汪
皮皮: 汪汪
*/

方法表达式

package main

import "fmt"

type Dog struct {
	name string
}

func (dog Dog) call() {
	fmt.Printf("%s: 汪汪\n", dog.name)
}

func (dog *Dog) setName(name string) {
	dog.name = name

}

func main() {
	m1 := Dog.call //结构体去声明
	m2 := (*Dog).setName
	fmt.Printf("%T,%T\n", m1, m2)

	dog := Dog{"冬冬"}
	m1(dog)
	m2(&dog, "小黑")
	m1(dog)
	dog.setName("小白")
	m1(dog)

	pdog := &Dog{"灰灰"}
	m1(*pdog)
	m2(pdog, "小黑")
	m1(*pdog)
	m2(pdog, "小白")
	m1(*pdog)
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值