golang的方法

本文详细解释了面向对象编程中的方法概念,涉及函数与对象关联、参数处理、指针与接口的区别,以及匿名嵌入、方法集和方法值的使用。通过实例展示了如何在编译器支持下进行值传递和指针操作,以及注意事项如不能多级指针调用方法。
摘要由CSDN通过智能技术生成

6.方法

方法是与对象实例(instance)绑定的特殊函数

方法面对对象编程,维护和展示对象自身状态。

函数专注与算法流程,接受参数并且完成逻辑运算,返回结果并清理现场

接收参数可以是指针类型,调用时决定是否复制

note:不能为指针和接口定义方法,即类型N不能是接口或者指针

编译器可以根据接收参数类型,自动在值与指针间转换

type N int
​
func (n N) copy() {
    fmt.Printf("%p, %v\n", &n, n)
}
​
func (n *N) ref() {
    fmt.Printf("%p, %v\n", n, *n)
}
​
// -----------------------------
​
func main() {
    var a N = 25
    fmt.Printf("%p\n", &a)  // 0xc000014080
​
    a.copy()                // 0xc000014088, 25
    N.copy(a)               // 0xc0000140a0, 25
​
    a++
    
    a.ref()                 // 0xc000014080, 26
    (*N).ref(&a)            // 0xc000014080, 26
}

type N int
func (n N) copy() {}
func (n *N) ref() {}
​
//---------------------
​
func main() {
    var a N = 25
    var p *N = &a
​
    a.copy()
    a.ref()     // (*N).ref(&a)
​
    p.copy()    // N.copy(*p)
    p.ref()
}

不能以多级指针调用方法

6.1匿名嵌入

同名遮蔽,结构体中有相同的字段名,按最小优先原则访问。

若两个同名方法深度相同,则需要显式指出

6.2方法集

根据接收参数(receiver)的不同,可分为 T 和 T 两种视角。

T.set = T

T.set = T + *T

原因是 接口会复制对象,而复制品不能寻址

而×T实现接口,取值和复制指针都没问题

6.3方法值

方法除了直接调用外,还可以赋值给变量,或者作为参数传递

type N int
​
func (n N) copy() {
    fmt.Printf("%p, %v\n", &n, n)
}
​
func (n *N) ref() {
    fmt.Printf("%p, %v\n", n, *n)
}
​
// -----------------------------
​
func main() {
    var n N = 100
​
    // expression
    var e func(*N)() = (*N).ref
    e(&n)
​
    // value
    var v func() = n.ref
    v()
}

将copy还原为了普通函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值