golang方法实现
更新时间:2023-10-30Go语言方法的概念
Go语言是一个支持面向对象编程(OOP)的编程语言。在Go语言中,我们可以通过声明方法(method)来给自定义类型(struct类型)添加行为。方法在Go语言中的格式有点类似于Python和Ruby编程语言中的函数。
方法的语法
在Go语言中,方法的语法格式如下:
func (t Type) methodName(parameter-list) (return-list) { // 方法实现 }其中,func关键字表示声明一个函数;Type为方法所属的类型,它必须定义在同一个包中;methodName为方法的名称;parameter-list为参数列表,可以为0或多个,用逗号分隔;return-list为返回值列表,可以为0或多个,用逗号分隔。 下面是一个示例代码,展示了如何在Go语言中声明一个方法:
type Person struct { name string age int } // 声明一个方法,该方法的接收者类型为Person func (p Person) display() { fmt.Println(p.name, "is", p.age, "years old.") }该示例代码中,我们定义了一个名为Person的结构体,该结构体包含了两个字段,分别为name和age。我们通过在结构体上定义一个名为display的方法,将其转换为一个可以输出信息的对象类型。
方法的使用
有两种使用方法的方式:通过结构体变量名和指向变量的指针。
通过结构体变量名使用方法
// main函数 func main() { // 声明并初始化一个结构体变量 p := Person{ name: "Tom", age: 18, } // 调用结构体上的方法 p.display() }该示例代码中,我们声明了一个名为p的结构体变量,并使用初始化列表指定了两个字段的值。然后,我们调用了该结构体的display方法,从控制台输出了Tom is 18 years old.。
通过指向变量的指针使用方法
// main函数 func main() { // 声明并初始化一个指向结构体的指针 p := &Person{ name: "Tom", age: 18, } // 调用指向结构体的指针上的方法 p.display() }该示例代码中,我们声明并初始化了一个指向Person结构体的指针类型p,并将它作为参数传递给display方法。由于p是指针类型,我们必须在调用display方法时使用p.display()表达式,而不是*p.display()表达式。
方法的值接收和指针接收
在Go语言中,方法可以从接收者(receiver)的值或指针上被调用。当方法被调用时,编译器将自动将它的接收者作为该方法的第一个参数传递进去。我们可以通过使用值接收或指针接收来控制接收者在方法调用中的传递方式。
值接收
// 声明一个值接收的方法 func (p Person) setValue(name string, age int) { p.name = name p.age = age } // main函数 func main() { // 声明并初始化一个结构体变量 p := Person{ name: "Tom", age: 18, } // 调用结构体上的方法 p.setValue("Lucy", 20) // 输出值被改变的结构体变量的字段 fmt.Println(p.name, "is", p.age, "years old.") }该示例代码中,我们声明了一个名为setValue的值接收的方法。该方法的作用是修改接收者的name和age字段的值。然后我们创建了一个名为p的Person结构体变量,并将其分配给了Tom和18的值。然后,我们调用setName方法将其值更改为Lucy和20,并在控制台打印了该结构体变量。
指针接收
// 声明一个指针接收的方法 func (p *Person) setValue(name string, age int) { p.name = name p.age = age } // main函数 func main() { // 声明并初始化一个指向结构体的指针 p := &Person{ name: "Tom", age: 18, } // 调用指向结构体的指针上的方法 p.setValue("Lucy", 20) // 输出值被改变的结构体变量的字段 fmt.Println(p.name, "is", p.age, "years old.") }该示例代码中,我们声明了一个指针接收的setValue方法。该方法的作用与前一个示例相同。然后,我们创建了一个指向Person结构体的指针类型p,将其name和age字段分配为Tom和18的值。接下来,我们调用了setValue方法,并将其值更改为Lucy和20,并在控制台打印了该结构体变量的字段。在这种情况下,我们必须使用指针类型作为接收者。