golang 结构体struct 08

谁践踏了优雅 2022-12-10 07:26 292阅读 0赞

1.简单结构体

  1. /*
  2. 普通结构体
  3. */
  4. type Student struct {
  5. Name string
  6. Age int
  7. Score int
  8. }
  9. /*
  10. 双向链表
  11. */
  12. type List struct {
  13. Name string
  14. Next* List
  15. Prev* List
  16. }
  17. /*
  18. 二叉树
  19. */
  20. type Tree struct {
  21. Name string
  22. left* Tree
  23. right* Tree
  24. }

2.创建

  1. /*
  2. make 用来创建map、slice、channel
  3. new用来创建值类型
  4. */
  5. func RunStruct() {
  6. //结构体(传入其他函数,修改是不会同步到本身的)
  7. var stu1 Student
  8. //指针(可以对本身修改)
  9. var stu2 = new(Student)
  10. var stu3 = &Student{"name",66,100}
  11. stu1.Age =777
  12. fmt.Println(stu1,stu2,stu3)
  13. fmt.Println(stu3.Age)
  14. use(stu1,stu3)
  15. fmt.Println(stu1,stu3)
  16. tagRun()
  17. }
  18. func use(stu1 Student, stu3 *Student) {
  19. stu1.Age = 100
  20. stu3.Age = 1000
  21. }

3.struct的方法

  1. type Person struct {
  2. Name string
  3. Age int
  4. }
  5. /*
  6. struct的方法
  7. 名称
  8. 大写外部可访问
  9. 小写只有本包才能访问
  10. */
  11. func (this Person) test() {
  12. fmt.Println(this.Age)
  13. }
  14. /*
  15. 实现 string方法,fmt.Println(m) 会自动输出这个
  16. */
  17. func (m Person) String() string {
  18. return m.Name + "66666"
  19. }

4.tag

  1. /*
  2. 转成json的时候 后面的名字会替换前面的名称(前面必须大写,不然会被json格式化丢弃)
  3. */
  4. type Person struct {
  5. Name string `json:"name"`
  6. Age int `chinaL:"dabai"`
  7. }
  8. /*
  9. struct的方法
  10. 名称
  11. 大写外部可访问
  12. 小写只有本包才能访问
  13. */
  14. func (this Person) test() {
  15. fmt.Println(this.Age)
  16. }
  17. /*
  18. 实现 string方法,fmt.Println(m) 会自动输出这个
  19. */
  20. func (m Person) String() string {
  21. return m.Name + "66666"
  22. }
  23. func tagRun() {
  24. person := Person { "tom", 12 }
  25. //json 格式化
  26. if b, err := json.Marshal(person); err != nil {
  27. fmt.Printf("error: %s", err.Error())
  28. } else {
  29. fmt.Printf("value: %s", b)
  30. }
  31. fmt.Println("")
  32. //反射获取值,获取我tag
  33. v := reflect.ValueOf(person)
  34. for i := 0; i < v.NumField(); i++ {
  35. fieldTag := v.Type().Field(i).Tag
  36. fieldName := v.Type().Field(i).Name
  37. fieldType := v.Field(i).Type()
  38. fieldValue := v.Field(i).Interface()
  39. fmt.Println("fieldTag: ",fieldTag)
  40. fmt.Println("fieldTag.value: ",fieldTag.Get("chinaL"))
  41. fmt.Println("fieldName: ",fieldName)
  42. fmt.Println("fieldType: ",fieldType)
  43. fmt.Println("fieldValue: ",fieldValue)
  44. }
  45. //这里是获取指针信息
  46. kk := 66.6
  47. fv := reflect.ValueOf(&kk)
  48. fv.Elem().SetFloat(3.3) //修改指针的变量
  49. fmt.Println("Elem: ",fv,kk)
  50. //调用结构体的方法
  51. person.test()
  52. fmt.Println(person)
  53. }
  54. /*
  55. 自定义类型
  56. 1.type integer int
  57. 2.type player struct
  58. 内存中是连续存储空间
  59. */
  60. type userinfo struct {
  61. playerId string
  62. age int16
  63. heig int16
  64. hobby []string
  65. morinfo map[string]interface{}
  66. }
  67. type people struct {
  68. playerId string
  69. age int16
  70. heig int16
  71. hobby []string
  72. morinfo map[string]interface{}
  73. }
  74. func runUserinfo() {
  75. //1
  76. var cardInfo userinfo
  77. cardInfo.age = 1
  78. cardInfo.heig = 161
  79. cardInfo.hobby = []string{"ok", "1", "土豆"}
  80. cardInfo.morinfo = map[string]interface{}{"1": 2, "2": "aaaaa"}
  81. fmt.Println(cardInfo)
  82. //2
  83. cardInfo2 := userinfo{"66", 1, 5, []string{"1", "2"}, map[string]interface{}{"adsa": "asdsa"}}
  84. fmt.Printf("asdasd = %v\n", cardInfo2)
  85. //3 new 获取到的是指针
  86. var cardInfo3 *userinfo = new(userinfo)
  87. (*cardInfo3).playerId = "1111111111"
  88. (*cardInfo3).age = 66
  89. (*cardInfo3).morinfo = map[string]interface{}{"hahaha": "aaaaaa"}
  90. (*cardInfo3).hobby = []string{"1", "ttt", "uuu"}
  91. fmt.Println(cardInfo3)
  92. //4
  93. var cardInfo4 = &userinfo{
  94. playerId: "12313",
  95. age: 56,
  96. heig: 6,
  97. hobby: nil,
  98. morinfo: nil,
  99. }
  100. fmt.Println(cardInfo4)
  101. }

发表评论

表情:
评论列表 (有 0 条评论,292人围观)

还没有评论,来说两句吧...

相关阅读