方法
方法是一类带有特殊参数的函数
package main
import (
"fmt"
"math"
)
// Vertex 是结构体
type Vertex struct {
X float64
Y float64
}
// Abs 是一个方法
// 方法就是一类带有特殊参数的函数
func (v Vertex) Abs() byte {
return byte(math.Sqrt(v.X*v.X + v.Y*v.Y))
}
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
}
写成函数
package main
import (
"fmt"
"math"
)
// Vertex 是结构体
type Vertex struct {
X float64
Y float64
}
// Abs 是一个方法
// 方法就是一类带有特殊参数的函数
func (v Vertex) Abs() byte {
return byte(math.Sqrt(v.X*v.X + v.Y*v.Y))
}
//Abs 写成函数
func Abs(v Vertex) byte {
return byte(math.Sqrt(v.X*v.X + v.Y*v.Y))
}
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
fmt.Println(Abs(v))
}
不用结构体
package main
import (
"fmt"
)
// MyLong 是自定义的类型
type MyLong uint64
// Change 测试不用结构体来定义
func (l MyLong) Change() uint64 {
return uint64(l) //这里还必须强转
}
func main() {
s := MyLong(2) //这里也必须用参数类型来定义变量,变量才能调用方法..
fmt.Println(s.Change())
}
小结
方法其实不能说是函数的,方法更像是一个类一样,所以会有接收者这个说法,用定义的接收者来调用这个方法
Go 没有类。不过你可以为结构体类型定义方法。 方法就是一类带特殊的 接收者 参数的函数。 方法接收者在它自己的参数列表内,位于
func
关键字和方法名之间。 在下面的代码中,Abs方法和Scale方法都有一个名为 v 类型为Vertex 的接收者。
package main
import (
"fmt"
"math"
)
// Vertex 先定义个结构体
type Vertex struct {
X, Y float64
}
// Abs 用来算平方和
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
// Scale 用来把结构体内的数据做修改
// 如果用函数的逻辑来看,其实好像也没毛病,因为Scale(f float64)是参数
func (v *Vertex) Scale(f float64) {
v.X = v.X + f
v.Y = v.Y + f
}
func main() {
v := Vertex{2, 3}
v.Scale(1)
fmt.Println(v.Abs())
}
方法来写一个类
package main
import "fmt"
// Student 用来定义一个Student的类型(类)
type Student struct {
id int
name string
}
func (student Student) study() {
fmt.Println("好好学习,天天向上")
}
// 注意此处必须是指针类型才可以修改哦,或者说实例化才会有效果哦
func (student *Student) idCard(id int, name string) {
student.id = id
student.name = name
}
func main() {
var Mike Student
Mike.study()
Mike.idCard(323, "Mike")
fmt.Println(Mike)
}