📜  如何在 Golang 中添加结构类型的方法?

📅  最后修改于: 2021-10-25 02:59:42             🧑  作者: Mango

结构由数据组成,但除此之外,结构还以方法的形式说明行为。附加到结构体的方法与普通函数的定义非常相似,唯一的变化是您需要额外指定其类型。

返回整数且不带参数的普通函数看起来像。

func function_name() int {
    //code
}

将上述函数与 type_name() 类型相关联看起来像。

type type_name struct { }
func (m type_name) function_name() int {
    //code
}

在下面的代码中,Area()函数被添加到结构 Rect。在这里, Area() 使用func (re Rect) Area() int显式使用 Rect 类型

例子:

package main
  
import "fmt"
  
// taking a struct
type Rect struct {
    len, wid int
}
  
func (re Rect) Area() int {
    return re.len * re.wid
}
  
func main() {
    r := Rect{10, 12}
    fmt.Println("Length and Width are:", r)
    fmt.Println("Area of Rectangle: ", r.Area())
}

输出:

Length and Width are: {10, 12}
Area of Rectangle: 120

Go 语言不使用thisself 之类的关键字,相反,在 Go 语言中,当您定义与类型关联的方法时,它会作为命名变量(r Rect) (例如在上述情况下)给出,然后在使用该方法re变量。

在上面的代码中, Rect 的实例作为 value传递,以调用方法 Area()。您也可以通过引用传递它。无论您用来调用它的实例是指针还是值,调用该方法都没有区别,Go 会自动为您进行转换。

package main
  
import "fmt"
  
// taking a struct
type Rect struct {
    len, wid int
}
  
func (re Rect) Area_by_value() int {
    return re.len * re.wid
}
  
func (re *Rect) Area_by_reference() int {
    return re.len * re.wid
}
  
// main function
func main() {
    r := Rect{10, 12}
    fmt.Println("Length and Width is:", r)
    fmt.Println("Area of Rectangle is:", r.Area_by_value())
    fmt.Println("Area of Rectangle is:", r.Area_by_reference())
    fmt.Println("Area of Rectangle is:", (&r).Area_by_value())
    fmt.Println("Area of Rectangle is:", (&r).Area_by_reference())
}

输出:

Length and Width is: {10, 12}
Area of Rectangle is: 120
Area of Rectangle is: 120
Area of Rectangle is: 120
Area of Rectangle is: 120

在上面的代码中,我们定义了两个类似的方法,一个以 instance(Rect) 为指针,另一个以值获取。这两种方法都通过值 r 和地址 &r 调用。但由于 Go 执行适当的转换,它显示相同的结果。