方法

方法定义

跟go一样,在函数名前面加接收者,就是方法

接收者默认不可变,如果要修改接收者,要加上mut

结构体方法,可以定义在同一个模块目录的不同源文件中

  1. struct User {
  2. mut:
  3. name string
  4. age int
  5. }
  6. fn (u User) get_name() string {
  7. return u.name
  8. }
  9. fn (mut u User) set_name(name string) { //需要修改接收者,要加上mut
  10. u.name = name
  11. }

除了可以给结构体添加方法外,还可以给以下类型添加方法:

  • 枚举
  • 类型别名
  • 函数类型
  • 联合类型
  • 自定义数组类型
  • 自定义字典类型
  1. module main
  2. struct Point {
  3. x int
  4. y int
  5. }
  6. enum Color {
  7. white
  8. black
  9. blue
  10. }
  11. type Myint = int
  12. type MyFn = fn (int, int) int
  13. type Mysumtype = int | string
  14. pub fn (c Color) str() string { // 枚举的方法
  15. return 'from color'
  16. }
  17. pub fn (m Myint) str() string { // 类型别名的方法
  18. return 'from myint'
  19. }
  20. pub fn (myfn MyFn) str2() string { // 函数类型的方法
  21. return 'from myfn'
  22. }
  23. pub fn (mysum Mysumtype) str() string { // 联合类型的方法
  24. return 'from mysumtype'
  25. }
  26. pub fn (myarr []Point) point_arr_method() string { // 自定义数组类型的方法,接收者是对应的数组类型
  27. return 'from []Point'
  28. }
  29. pub fn (mymap map[string]Point) point_map_method() string { // 自定义字典类型的方法,接收者是对应的字典类型
  30. return 'from map[string]Point'
  31. }
  32. fn fn2(f MyFn) {
  33. println(f(1, 3)) // 直接调用函数
  34. println(f.str2()) // 调用函数类型的方法
  35. }
  36. fn add(x int, y int) int {
  37. return x + y
  38. }
  39. fn main() {
  40. // 枚举方法
  41. c := Color.white
  42. println(c.str())
  43. // 类型别名方法
  44. i := Myint(11)
  45. println(i.str())
  46. // 联合类型方法
  47. mut m := Mysumtype{}
  48. m = int(11)
  49. println(m.str())
  50. // 函数类型方法
  51. fn2(add)
  52. // 直接定义函数类型
  53. f := MyFn(add)
  54. println(f.str2()) // 调用函数类型的方法
  55. // 自定义数组类型方法
  56. p := Point{
  57. x: 1
  58. y: 2
  59. }
  60. mut p_array := []Point{}
  61. p_array << p
  62. println(p_array.point_arr_method())
  63. // 自定义字典类型方法
  64. mut mp := map[string]Point{}
  65. println(mp.point_map_method())
  66. }

方法链式调用

方法支持链式调用

  1. module main
  2. struct DB {
  3. mut:
  4. sql string
  5. }
  6. fn new() &DB { // &表示取地址,引用
  7. return &DB{
  8. sql: ''
  9. }
  10. }
  11. fn (mut db DB) table(name string) &DB { // &表示取地址,引用
  12. db.sql += name
  13. return db
  14. }
  15. fn (mut db DB) where(condition string) &DB {
  16. db.sql += condition
  17. return db
  18. }
  19. fn (mut db DB) first() &DB {
  20. db.sql += 'limit 1'
  21. return db
  22. }
  23. fn main() {
  24. mut db := new()
  25. // 链式调用
  26. db.table('select * from user ').where('where id=1 ').first()
  27. println(db.sql) // 输出:select * from user where id=1 limit 1
  28. }