方法

方法是一类带有特殊参数的函数

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. // Vertex 是结构体
  7. type Vertex struct {
  8. X float64
  9. Y float64
  10. }
  11. // Abs 是一个方法
  12. // 方法就是一类带有特殊参数的函数
  13. func (v Vertex) Abs() byte {
  14. return byte(math.Sqrt(v.X*v.X + v.Y*v.Y))
  15. }
  16. func main() {
  17. v := Vertex{3, 4}
  18. fmt.Println(v.Abs())
  19. }

写成函数

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. // Vertex 是结构体
  7. type Vertex struct {
  8. X float64
  9. Y float64
  10. }
  11. // Abs 是一个方法
  12. // 方法就是一类带有特殊参数的函数
  13. func (v Vertex) Abs() byte {
  14. return byte(math.Sqrt(v.X*v.X + v.Y*v.Y))
  15. }
  16. //Abs 写成函数
  17. func Abs(v Vertex) byte {
  18. return byte(math.Sqrt(v.X*v.X + v.Y*v.Y))
  19. }
  20. func main() {
  21. v := Vertex{3, 4}
  22. fmt.Println(v.Abs())
  23. fmt.Println(Abs(v))
  24. }

不用结构体

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // MyLong 是自定义的类型
  6. type MyLong uint64
  7. // Change 测试不用结构体来定义
  8. func (l MyLong) Change() uint64 {
  9. return uint64(l) //这里还必须强转
  10. }
  11. func main() {
  12. s := MyLong(2) //这里也必须用参数类型来定义变量,变量才能调用方法..
  13. fmt.Println(s.Change())
  14. }

小结

方法其实不能说是函数的,方法更像是一个类一样,所以会有接收者这个说法,用定义的接收者来调用这个方法

Go 没有类。不过你可以为结构体类型定义方法。 方法就是一类带特殊的 接收者 参数的函数。 方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。 在下面的代码中,Abs方法和Scale方法都有一个名为 v 类型为Vertex 的接收者。

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. // Vertex 先定义个结构体
  7. type Vertex struct {
  8. X, Y float64
  9. }
  10. // Abs 用来算平方和
  11. func (v Vertex) Abs() float64 {
  12. return math.Sqrt(v.X*v.X + v.Y*v.Y)
  13. }
  14. // Scale 用来把结构体内的数据做修改
  15. // 如果用函数的逻辑来看,其实好像也没毛病,因为Scale(f float64)是参数
  16. func (v *Vertex) Scale(f float64) {
  17. v.X = v.X + f
  18. v.Y = v.Y + f
  19. }
  20. func main() {
  21. v := Vertex{2, 3}
  22. v.Scale(1)
  23. fmt.Println(v.Abs())
  24. }

方法来写一个类

  1. package main
  2. import "fmt"
  3. // Student 用来定义一个Student的类型(类)
  4. type Student struct {
  5. id int
  6. name string
  7. }
  8. func (student Student) study() {
  9. fmt.Println("好好学习,天天向上")
  10. }
  11. // 注意此处必须是指针类型才可以修改哦,或者说实例化才会有效果哦
  12. func (student *Student) idCard(id int, name string) {
  13. student.id = id
  14. student.name = name
  15. }
  16. func main() {
  17. var Mike Student
  18. Mike.study()
  19. Mike.idCard(323, "Mike")
  20. fmt.Println(Mike)
  21. }