Go Lang 实战

Go方法(一)

2019-08-02  本文已影响0人  草莓君_

定义

方法是与对象实例绑定的特殊函数。
方法是面向对象编程的基本概念,用于维护和展示对象的自身状态。对象是内敛的,每个实例都有各自不要的独立特征,以属性和方法来暴露对外通信接口。普通函数则专注于算法流程,通过接受参数来完成特定逻辑运算,并返回最终结果。换句话说,方法是有关联的,而函数通常没有。
方法和函数定义语法区别在于前者有前置实例接收参数(receiver),编译器以此确定方法所属类型。在某些语言里,尽管没有显式定义,但会在调用时隐式传递this实例参数。
可以为当前包,以及除接口和指针以外的任何类型定义方法。

type N int

func (n N) toString() string {
    return fmt.Sprintf("%#x", n) //输出ASCII码
}
func main() {
    var a N = 25
    println(a.toString())
}

方法同样不支持重载(overload)。receiver参数名没有限制,按惯例会选用简短有意义的名称(不推荐使用this、self)。如方法内部并不引用实例,可省略参数名,仅保留类型。

type N int
func (N) test() {
    println("hello world")
}

方法可看作特殊的函数,那么receiver的类型自然可以是基础类型或指针类型。这回关系到调用时对象实例是否被复制。

type N int
func (n N) value() {
    n++
    fmt.Printf("v: %p, %v\n", &n, n)
}

func (n *N) pointer() {
    (*n)++
    fmt.Printf("v: %p, %v\n", n, *n)
}

func main() {
    var a N = 25
    a.value()
    a.pointer()
    fmt.Printf("v: %p, %v\n", &a, a)
}

输出:

v: 0xc00008e008, 26     //可以看到指针地址改变,接受者复制了数据
v: 0xc00008e000, 26
v: 0xc00008e000, 26
上一篇 下一篇

猜你喜欢

热点阅读