Go語言支持方法。Go方法與Go函數(shù)相似,但有一點不同,就是方法中包含一個接收者參數(shù)。在接收者參數(shù)的幫助下,該方法可以訪問接收者的屬性。在這里,接收方可以是結(jié)構(gòu)類型或非結(jié)構(gòu)類型。在代碼中創(chuàng)建方法時,接收者和接收者類型必須出現(xiàn)在同一個包中。而且不允許創(chuàng)建一個方法,其中的接收者類型已經(jīng)在另一個包中定義,包括像int、string等內(nèi)建類型。如果您嘗試這樣做,那么編譯器將拋出錯誤。
語法:
func(reciver_name Type) method_name(parameter_list)(return_type){ // Code }
在此,可以在方法內(nèi)訪問接收器。
在Go語言中,允許您定義其接收者為結(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語言中,只要類型和方法定義存在于同一包中,就可以使用非結(jié)構(gòu)類型接收器創(chuàng)建方法。如果它們存在于int,string等不同的包中,則編譯器將拋出錯誤,因為它們是在不同的包中定義的。
package main import "fmt" //類型定義 type data int //定義一個方法 //非結(jié)構(gòu)類型的接收器 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("最終結(jié)果: ", res) }
輸出:
最終結(jié)果: 460
在Go語言中,允許您使用指針接收器創(chuàng)建方法。在指針接收器的幫助下,如果方法中所做的更改將反映在調(diào)用方中,這對于值接收器是不可能的。
語法:
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)建一個指針 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)一個函數(shù)具有值參數(shù)時,它將僅接受參數(shù)的值,如果您嘗試將指針傳遞給值函數(shù),則它將不接受,反之亦然。但是Go方法可以接受值和指針,無論它是使用指針還是值接收器定義的。如下例所示:
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ù)。 |