方法
方法是一类带有特殊参数的函数
package mainimport ("fmt""math")// Vertex 是结构体type Vertex struct {X float64Y 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 mainimport ("fmt""math")// Vertex 是结构体type Vertex struct {X float64Y 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 mainimport ("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 mainimport ("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 + fv.Y = v.Y + f}func main() {v := Vertex{2, 3}v.Scale(1)fmt.Println(v.Abs())}
方法来写一个类
package mainimport "fmt"// Student 用来定义一个Student的类型(类)type Student struct {id intname string}func (student Student) study() {fmt.Println("好好学习,天天向上")}// 注意此处必须是指针类型才可以修改哦,或者说实例化才会有效果哦func (student *Student) idCard(id int, name string) {student.id = idstudent.name = name}func main() {var Mike StudentMike.study()Mike.idCard(323, "Mike")fmt.Println(Mike)}
