Go語(yǔ)言支持方法。Go方法與Go函數(shù)相似,但有一點(diǎn)不同,就是方法中包含一個(gè)接收者參數(shù)。在接收者參數(shù)的幫助下,該方法可以訪問接收者的屬性。在這里,接收方可以是結(jié)構(gòu)類型或非結(jié)構(gòu)類型。在代碼中創(chuàng)建方法時(shí),接收者和接收者類型必須出現(xiàn)在同一個(gè)包中。而且不允許創(chuàng)建一個(gè)方法,其中的接收者類型已經(jīng)在另一個(gè)包中定義,包括像int、string等內(nèi)建類型。如果您嘗試這樣做,那么編譯器將拋出錯(cuò)誤。
語(yǔ)法:
func(reciver_name Type) method_name(parameter_list)(return_type){
// Code
}在此,可以在方法內(nèi)訪問接收器。
在Go語(yǔ)言中,允許您定義其接收者為結(jié)構(gòu)類型的方法。可以在方法內(nèi)部訪問此接收器,如以下示例所示:
package main
import "fmt"
//Author 結(jié)構(gòu)體
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結(jié)構(gòu)體
res := author{
name: "Sona",
branch: "CSE",
particles: 203,
salary: 34000,
}
//調(diào)用方法
res.show()
}輸出:
Author's Name: Sona Branch Name: CSE Published articles: 203 Salary: 34000
在Go語(yǔ)言中,只要類型和方法定義存在于同一包中,就可以使用非結(jié)構(gòu)類型接收器創(chuàng)建方法。如果它們存在于int,string等不同的包中,則編譯器將拋出錯(cuò)誤,因?yàn)樗鼈兪窃诓煌陌卸x的。
package main
import "fmt"
//類型定義
type data int
//定義一個(gè)方法
//非結(jié)構(gòu)類型的接收器
func (d1 data) multiply(d2 data) data {
return d1 * d2
}
/*
//如果您嘗試運(yùn)行此代碼,
//然后編譯器將拋出錯(cuò)誤
func(d1 int)multiply(d2 int)int{
return d1 * d2
}
*/
func main() {
value1 := data(23)
value2 := data(20)
res := value1.multiply(value2)
fmt.Println("最終結(jié)果: ", res)
}輸出:
最終結(jié)果: 460
在Go語(yǔ)言中,允許您使用指針接收器創(chuàng)建方法。在指針接收器的幫助下,如果方法中所做的更改將反映在調(diào)用方中,這對(duì)于值接收器是不可能的。
語(yǔ)法:
func (p *Type) method_name(...Type) Type {
// Code
}package main
import "fmt"
// Author 結(jié)構(gòu)體
type author struct {
name string
branch string
particles int
}
//方法,使用author類型的接收者
func (a *author) show(abranch string) {
(*a).branch = abranch
}
// Main function
func main() {
//初始化author結(jié)構(gòu)體
res := author{
name: "Sona",
branch: "CSE",
}
fmt.Println("Author's name: ", res.name)
fmt.Println("Branch Name(Before): ", res.branch)
//創(chuàng)建一個(gè)指針
p := &res
//調(diào)用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中,當(dāng)一個(gè)函數(shù)具有值參數(shù)時(shí),它將僅接受參數(shù)的值,如果您嘗試將指針傳遞給值函數(shù),則它將不接受,反之亦然。但是Go方法可以接受值和指針,無(wú)論它是使用指針還是值接收器定義的。如下例所示:
package main
import "fmt"
// Author 結(jié)構(gòu)體
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() {
//初始化值
//作者結(jié)構(gòu)體
res := author{
name: "Sona",
branch: "CSE",
}
fmt.Println("Branch Name(Before): ", res.branch)
//調(diào)用show_1方法
//(指針方法)帶有值
res.show_1("ECE")
fmt.Println("Branch Name(After): ", res.branch)
//調(diào)用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
| 方法 | 函數(shù) |
|---|---|
它包含接收器。 | 它不包含接收器。 |
它可以接受指針和值。 | 它不能同時(shí)接受指針和值。 |
可以在程序中定義相同名稱但不同類型的方法。 | 程序中不允許定義相同名稱但不同類型的函數(shù)。 |