Go语言支持方法。Go方法与Go函数相似,但有一点不同,就是方法中包含一个接收者参数。在接收者参数的帮助下,该方法可以访问接收者的属性。在这里,接收方可以是结构类型或非结构类型。在代码中创建方法时,接收者和接收者类型必须出现在同一个包中。而且不允许创建一个方法,其中的接收者类型已经在另一个包中定义,包括像int、string等内建类型。如果您尝试这样做,那么编译器将抛出错误。
语法:
func(reciver_name Type) method_name(parameter_list)(return_type){ // Code }
在此,可以在方法内访问接收器。
在Go语言中,允许您定义其接收者为结构类型的方法。可以在方法内部访问此接收器,如以下示例所示:
package main import "fmt" //Author 结构体 type author struct { name string branch string particles int salary int } //接收者的方法 func (a author) show() { fmt.Println("Author's Name: ", a.name) fmt.Println("Branch Name: ", a.branch) fmt.Println("Published articles: ", a.particles) fmt.Println("Salary: ", a.salary) } func main() { //初始化值 //Author结构体 res := author{ name: "Sona", branch: "CSE", particles: 203, salary: 34000, } //调用方法 res.show() }
输出:
Author's Name: Sona Branch Name: CSE Published articles: 203 Salary: 34000
在Go语言中,只要类型和方法定义存在于同一包中,就可以使用非结构类型接收器创建方法。如果它们存在于int,string等不同的包中,则编译器将抛出错误,因为它们是在不同的包中定义的。
package main import "fmt" //类型定义 type data int //定义一个方法 //非结构类型的接收器 func (d1 data) multiply(d2 data) data { return d1 * d2 } /* //如果您尝试运行此代码, //然后编译器将抛出错误 func(d1 int)multiply(d2 int)int{ return d1 * d2 } */ func main() { value1 := data(23) value2 := data(20) res := value1.multiply(value2) fmt.Println("最终结果: ", res) }
输出:
最终结果: 460
在Go语言中,允许您使用指针接收器创建方法。在指针接收器的帮助下,如果方法中所做的更改将反映在调用方中,这对于值接收器是不可能的。
语法:
func (p *Type) method_name(...Type) Type { // Code }
package main import "fmt" // Author 结构体 type author struct { name string branch string particles int } //方法,使用author类型的接收者 func (a *author) show(abranch string) { (*a).branch = abranch } // Main function func main() { //初始化author结构体 res := author{ name: "Sona", branch: "CSE", } fmt.Println("Author's name: ", res.name) fmt.Println("Branch Name(Before): ", res.branch) //创建一个指针 p := &res //调用show方法 p.show("ECE") fmt.Println("Author's name: ", res.name) fmt.Println("Branch Name(After): ", res.branch) }
输出:
Author's name: Sona Branch Name(Before): CSE Author's name: Sona Branch Name(After): ECE
众所周知,在Go中,当一个函数具有值参数时,它将仅接受参数的值,如果您尝试将指针传递给值函数,则它将不接受,反之亦然。但是Go方法可以接受值和指针,无论它是使用指针还是值接收器定义的。如下例所示:
package main import "fmt" // Author 结构体 type author struct { name string branch string } //带有指针的方法 //author类型的接收者 func (a *author) show_1(abranch string) { (*a).branch = abranch } //带有值的方法 //作者类型的接收者 func (a author) show_2() { a.name = "Gourav" fmt.Println("Author's name(Before) : ", a.name) } func main() { //初始化值 //作者结构体 res := author{ name: "Sona", branch: "CSE", } fmt.Println("Branch Name(Before): ", res.branch) //调用show_1方法 //(指针方法)带有值 res.show_1("ECE") fmt.Println("Branch Name(After): ", res.branch) //调用show_2方法 //带有指针的(值方法) (&res).show_2() fmt.Println("Author's name(After): ", res.name) }
输出:
Branch Name(Before): CSE Branch Name(After): ECE Author's name(Before) : Gourav Author's name(After): Sona
方法 | 函数 |
---|---|
它包含接收器。 | 它不包含接收器。 |
它可以接受指针和值。 | 它不能同时接受指针和值。 |
可以在程序中定义相同名称但不同类型的方法。 | 程序中不允许定义相同名称但不同类型的函数。 |