学习呦
方法+-+新概念
方法 - 新概念
OOP面向对象编程
引例
func (c Celsius) String() string { |
和函数的对比
func hypot(x, y float64) float64 { |
可以看到和方法相比,hypot函数在函数名之前少了一个“()”包起来的东西,这个东西在方法中被称之为接收器(receiver)
再看一个更复杂一点的例子
type Path []Point |
上面的代码定一个Point[]类型的Path,下面的方法给他添加了一个Distance的方法。需要调用的时候就像下面这样
Path.Distance() |
但是,不能把这些看成java中的类,和类实例调用类中的方法。只是形式一样,不代表就是Java中类的概念(比如go没有继承概念)更重要的是,Java类的方法只能附加到类上,不能给其他基础类型附加,而go不一样,可以给其他类型附加一些特有的方法(上面的Path为切片类型,但是给他附加了一个方法)
注意: 类型类型名是一个指针的话,是不能作为接收器的参数的
type P *int |
Go语言圣经对于这里有两点:
不管你的method的receiver是指针类型还是非指针类型,都是可以通过指针/非指针类型进行调用 的,编译器会帮你做类型转换
在声明一个method的receiver该是指针还是非指针类型时,你需要考虑两方面的内部,第一方面是这 个对象本身是不是特别大,如果声明为非指针变量时,调用会产生一次拷贝;第二方面是如果你用指 针类型作为receiver,那么你一定要注意,这种指针类型指向的始终是一块内存地址,就算你对其进 行了拷贝。熟悉C或者C++的人这里应该很快能明白
如果一个对象里面有很多的数据,比如结构体,map类型,切片类型,甚至是方法。引用类型都是使用指向这些对象的指针对他们进行操作的