定义
方法是与对象实例绑定的特殊函数。
方法是面向对象编程的基本概念,用于维护和展示对象的自身状态。对象是内敛的,每个实例都有各自不要的独立特征,以属性和方法来暴露对外通信接口。普通函数则专注于算法流程,通过接受参数来完成特定逻辑运算,并返回最终结果。换句话说,方法是有关联的,而函数通常没有。
方法和函数定义语法区别在于前者有前置实例接收参数(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
网友评论