结构由数据组成,但除此之外,结构还以方法的形式说明行为。附加到结构体的方法与普通函数的定义非常相似,唯一的变化是您需要额外指定其类型。
返回整数且不带参数的普通函数看起来像。
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 语言不使用this或self 之类的关键字,相反,在 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 执行适当的转换,它显示相同的结果。