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建立的关联关系。

 

posted @ 2023-05-05 20:49  无虑的小猪  阅读(27)  评论(0编辑  收藏  举报