Go笔记(十一):方法
Go语言没有Java语言面向对象的特性,也无类对象的概念。但可以使用结构体实现这些特性。
1、方法的声明
Go中的方法是一种特殊的函数,与struct相关联,被称为struct的接收者。可以理解为方法就是有接收者的函数。语法格式如下:
type mystruct struct{} func (recv mystruct) my_method(para) return_type{} func (recv *mystruct) my_method(para) return_type{}
mystruct:定义的结构体
recv :接受该方法的结构体
my_method:方法名称
para:方法参数列表
return_type:方法返回值类型
示例代码如下:
1 package main 2 3 import "fmt" 4 5 // 结构体 6 type Book struct { 7 bookName string 8 } 9 10 // 方法 11 // 比函数多了一个接受者,接受者为结构体 12 func (bk Book) info(name string) bool { 13 fmt.Printf("book.bookName:%v is very good\n", bk.bookName) 14 return true; 15 } 16 17 func main() { 18 book := Book{"平凡的世界"} 19 book.info(book.bookName) 20 }
2、接收者类型
接收者类型有值类型和指针类型。区别在于接收者是否需要复制结构体副本。值类型复制副本,指针类型不复制副本。
2.1、值类型
以接收者是结构体为例,值类型示例代码如下:
1 package main 2 3 import "fmt" 4 5 // 结构体 6 type Book struct { 7 bookName string 8 } 9 10 // 比函数多了一个接受者,接受者为结构体,值类型接受者 11 func (bk Book) valueType() { 12 bk.bookName = bk.bookName + " valueType" 13 } 14 15 func main() { 16 17 bk := Book{"平凡的世界"} 18 // 值作为接受者 19 bk.valueType() 20 fmt.Printf("valueType: %v\n", bk) 21 }
2.2、指针类型
以接收者是结构体为例,指针类型示例代码如下:
1 package main 2 3 import "fmt" 4 5 // 结构体 6 type Book struct { 7 bookName string 8 } 9 10 // 比函数多了一个接受者,接受者为结构体,指针类型接受者 11 func (bk *Book) pointerType() { 12 bk.bookName = bk.bookName + " pointerType" 13 } 14 15 func main() { 16 17 bk := Book{"平凡的世界"} 18 // 指针作为接受者 19 bk.pointerType() 20 fmt.Printf("pointerType: %v\n", bk) 21 }
3、实现OOP的属性和方法
Go语言无面向对象的概念,也无封装的概念,但可通过结构体struct和方法来实现OOP的属性和方法等特性。
1 package main 2 3 import "fmt" 4 // 结构体 等价于 对象 ; name 等价于 属性 5 type Person struct { 6 name string 7 } 8 // receiver 接收者方法 等价于 方法 9 func (per Person) eat() { 10 fmt.Printf("run method: %v eat \n", per.name) 11 } 12 func main() { 13 // 等价于Java中的 new 对象 14 per := Person{"zs"} 15 // 输出属性 16 fmt.Printf("per.name: %v\n", per.name) 17 // 执行方法 18 per.eat() 19 }
4、方法的注意事项
1、struct结合其方法等价于面向对象的方法。struct可以与其方法分开,并非一定同属一个文件,但必须同属一个包;
2、方法两种接收类型:(T type)和(T *type);
3、方法就是函数,Go中无方法重载的概念,所以在Go中所用方法名必须唯一;
4、若receiver是一个指针类型,则会自动解除引用;
5、方法和type分开,表示实例的行为与数据存储是分开的,是通过receiver建立的关联关系。