【go语言】go语言的方法和接收器
一、结构体的方法
1.1、 面向过程实现方法
type Bag struct { items []int } // 将一个物品放入背包的过程 func Insert(b *Bag, itemid int) { b.items = append(b.items, itemid) } func main() { bag := new(Bag) Insert(bag, 1001) }
1.2、 面向对象实现方法
type Bag struct { items []int } func (b *Bag) Insert(itemid int) { b.items = append(b.items, itemid) } func main() { b := new(Bag) b.Insert(1001) }
二、结构体的接收器

2.1、接收器——方法作用的目标
2.1.1、书写格式
func (接收器变量 接收器类型) 方法名(参数列表) (返回参数) { 函数体 } 对各部分的说明: 接收器变量:接收器中的参数变量名在命名时,官方建议使用接收器类型名的第一个小写字母,而不是 self、this 之类的命名。例如,Socket 类型的接收器变量应该命名为 s,Connector 类型的接收器变量应该命名为 c 等。 接收器类型:接收器类型和参数类似,可以是指针类型和非指针类型。 方法名、参数列表、返回参数:格式与函数定义一致。
接收器根据接收器的类型可以分为指针接收器、非指针接收器,两种接收器在使用时会产生不同的效果,根据效果的不同,两种接收器会被用于不同性能和功能要求的代码中。
2.1.2、理解指针类型的接收器(接收器可读可写)
指针类型的接收器由一个结构体的指针组成,更接近于面向对象中的 this 或者 self。
由于指针的特性,调用方法时,修改接收器指针的任意成员变量,在方法结束后,修改都是有效的。
package main import "fmt" // 定义属性结构 type Property struct { value int // 属性值 } // 设置属性值 func (p *Property) SetValue(v int) { // 修改p的成员变量 p.value = v } // 取属性值 func (p *Property) Value() int { return p.value } func main() { // 实例化属性 p := new(Property) // 设置值 p.SetValue(100) // 打印值 fmt.Println(p.Value()) }
2.1.3、理解非指针类型的接收器(接口器只读不写)
当方法作用于非指针接收器时,Go语言会在代码运行时将接收器的值复制一份,在非指针接收器的方法中可以获取接收器的成员值,但修改后无效。
点(Point)使用结构体描述时,为点添加 Add() 方法,这个方法不能修改 Point 的成员 X、Y 变量,而是在计算后返回新的 Point 对象,Point 属于小内存对象,在函数返回值的复制过程中可以极大地提高代码运行效率,详细过程请参考下面的代码。
package main import ( "fmt" ) // 定义点结构 type Point struct { X int Y int } // 非指针接收器的加方法 func (p Point) Add(other Point) Point { // 成员值与参数相加后返回新的结构 return Point{p.X + other.X, p.Y + other.Y} } func main() { // 初始化点 p1 := Point{1, 1} p2 := Point{2, 2} // 与另外一个点相加 result := p1.Add(p2) // 输出结果 fmt.Println(result) } 代码输出如下: {3 3}
指针和非指针接收器的使用
在计算机中,小对象由于值复制时的速度较快,所以适合使用非指针接收器,大对象因为复制性能较低,适合使用指针接收器,在接收器和参数间传递时不进行复制,只是传递指针。
浙公网安备 33010602011771号