Golang 菜鳥教程

Golang 控制語句

Golang 函數(shù) & 方法

Golang 結(jié)構(gòu)體

Golang 切片 & 數(shù)組

Golang 字符串(String)

Golang 指針

Golang 接口

Golang 并發(fā)

Golang 異常(Error)

Golang 其他雜項

Go 語言方法(Method)

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)訪問接收器。

結(jié)構(gòu)類型接收器的方法

在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

非結(jié)構(gòu)類型接收器的方法

在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方法

在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ù)

它包含接收器。

它不包含接收器。

它可以接受指針和值。

它不能同時接受指針和值。

可以在程序中定義相同名稱但不同類型的方法。

程序中不允許定義相同名稱但不同類型的函數(shù)。
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清