Golang 方法

Golang 方法

Go语言支持方法。Go方法与Go函数类似,但有一点不同,即方法中包含一个接收方参数。在接收器参数的帮助下,方法可以访问接收器的属性。这里,接收器可以是结构类型,也可以是非结构类型。当你在代码中创建一个方法时,接收器和接收器类型必须存在于同一个包中。你不允许创建一个接收方类型已经在另一个包中定义的方法,包括int、string等内置的类型。如果你试图这样做,那么编译器将给出一个错误。

语法

func(reciver_name Type) method_name(parameter_list)(return_type){
// Code
}

这里,接收器可以在方法中被访问。

带有结构类型接收器的方法

在Go语言中,你可以定义一个方法,其接收器是一个结构类型。如下面的例子所示,这个接收器可以在方法内部被访问。

例子

// Go program to illustrate the
// method with struct type receiver
package main
 
import "fmt"
 
// Author structure
type author struct {
    name      string
    branch    string
    particles int
    salary    int
}
 
// Method with a receiver
// of author type
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)
}
 
// Main function
func main() {
 
    // Initializing the values
    // of the author structure
    res := author{
        name:      "Sona",
        branch:    "CSE",
        particles: 203,
        salary:    34000,
    }
 
    // Calling the method
    res.show()
}

输出

Author's Name:  Sona
Branch Name:  CSE
Published articles:  203
Salary:  34000

带有非结构化类型接收器的方法

在Go语言中,只要类型和方法的定义存在于同一个包中,你就可以创建一个带有非结构类型接收器的方法。如果它们出现在不同的包中,如int、string等,那么编译器将给出一个错误,因为它们被定义在不同的包中。

例子

// Go program to illustrate the method
// with non-struct type receiver
package main
 
import "fmt"
 
// Type definition
type data int
 
// Defining a method with
// non-struct type receiver
func (d1 data) multiply(d2 data) data {
    return d1 * d2
}
 
/*
// if you try to run this code,
// then compiler will throw an error
func(d1 int)multiply(d2 int)int{
return d1 * d2
}
*/
 
// Main function
func main() {
    value1 := data(23)
    value2 := data(20)
    res := value1.multiply(value2)
    fmt.Println("Final result: ", res)
}

输出

Final result:  460

带有指针接收器的方法

在Go语言中,你可以创建一个带有 指针 接收器的方法。在指针接收器的帮助下,如果方法发生了变化,它将反映在调用者身上,这在值接收器方法中是不可能的。

语法

func (p *Type) method_name(...Type) Type {
// Code
}

例子

// Go program to illustrate pointer receiver
package main
 
import "fmt"
 
// Author structure
type author struct {
    name      string
    branch    string
    particles int
}
 
// Method with a receiver of author type
func (a *author) show(abranch string) {
    (*a).branch = abranch
}
 
// Main function
func main() {
 
    // Initializing the values
    // of the author structure
    res := author{
        name:   "Sona",
        branch: "CSE",
    }
 
    fmt.Println("Author's name: ", res.name)
    fmt.Println("Branch Name(Before): ", res.branch)
 
    // Creating a pointer
    p := &res
 
    // Calling the show method
    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方法可以同时接受值和指针,无论它是用指针还是值的接收器定义的。正如下面的例子所示。

例子

// Go program to illustrate how the
// method can accept pointer and value
 
package main
 
import "fmt"
 
// Author structure
type author struct {
    name   string
    branch string
}
 
// Method with a pointer
// receiver of author type
func (a *author) show_1(abranch string) {
    (*a).branch = abranch
}
 
// Method with a value
// receiver of author type
func (a author) show_2() {
 
    a.name = "Gourav"
    fmt.Println("Author's name(Before) : ", a.name)
}
 
// Main function
func main() {
 
    // Initializing the values
    // of the author structure
    res := author{
        name:   "Sona",
        branch: "CSE",
    }
 
    fmt.Println("Branch Name(Before): ", res.branch)
 
    // Calling the show_1 method
    // (pointer method) with value
    res.show_1("ECE")
    fmt.Println("Branch Name(After): ", res.branch)
 
    // Calling the show_2 method
    // (value method) with a pointer
    (&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

方法与功能的区别

方法 功能性
它包含一个接收器。 它不包含一个接收器。
在程序中可以定义相同名称但不同类型的方法。 不允许在程序中定义同名但不同类型的函数。
它不能作为一阶对象使用。 可以作为一阶对象使用,可以通过

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程