结构体的基本定义和使用

代码

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. )
  7. // 定义一个结构体
  8. type Book struct {
  9. title string
  10. admin string
  11. price float64
  12. }
  13. // 传递一个 Book 副本
  14. func changBook1(v Book) {
  15. v.price = 10
  16. }
  17. // 传递一个 Book 指针
  18. func changBook2(v *Book) {
  19. v.price = 20.3
  20. }
  21. func main() {
  22. log.SetOutput(io.MultiWriter(os.Stdout))
  23. log.SetFlags(log.Lshortfile)
  24. var book1 = Book{}
  25. book1.title = "Golang"
  26. book1.admin = "张三"
  27. book1.price = 30.5
  28. log.Println(book1)
  29. log.Println("执行函数 changBook1")
  30. changBook1(book1)
  31. log.Println(book1) // price 没有被改变
  32. log.Println("执行函数 changBook2")
  33. changBook2(&book1)
  34. log.Println(book1) // price 被改变了
  35. }

输出

  1. main.go:38: {Golang 张三 30.5}
  2. main.go:40: 执行函数 changBook1
  3. main.go:42: {Golang 张三 30.5}
  4. main.go:44: 执行函数 changBook2
  5. main.go:46: {Golang 张三 20.3}

面向对象, 类的表示与封装

代码

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. )
  7. // 如果类名首字母大写,表示其他包也能够访问
  8. type Hero struct {
  9. // /如果说类的属性首字母大写,表示该属性是对外能够访问的,否则的话只能够类的内部访问
  10. name string
  11. sex string
  12. }
  13. // 在外部使用时获取主角名称
  14. func (t *Hero) GetNmae() string {
  15. name := t.name
  16. return name
  17. }
  18. // 主角唱歌方法, 传歌曲名
  19. // 方法名首字母大写,表示其他包也能够访问
  20. func (t *Hero) Singing(songName string) {
  21. log.Printf("%v开始唱%v\n", t.name, songName)
  22. }
  23. func main() {
  24. log.SetOutput(io.MultiWriter(os.Stdout))
  25. log.SetFlags(log.Lshortfile)
  26. hero1 := Hero{name: "张三"}
  27. hero1.sex = "男"
  28. hero1.Singing("好日子")
  29. log.Println(hero1)
  30. }

输出

  1. main.go:25: 张三开始唱好日子
  2. main.go:37: {张三 男}

使用反射获取结构体中的 tag 标签

代码

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. "reflect"
  7. )
  8. type Resume struct {
  9. Name string `info:"name" doc:"我的名字"`
  10. Sex string `info:"sex"`
  11. }
  12. func findTag(str interface{}) {
  13. t := reflect.TypeOf(str).Elem()
  14. // log.Println(t)
  15. for i := 0; i < t.NumField(); i++ {
  16. tagInfo := t.Field(i).Tag.Get("info")
  17. tagDoc := t.Field(i).Tag.Get("info")
  18. log.Printf("tagInfo=%v, tagDoc=%v\n", tagInfo, tagDoc)
  19. }
  20. }
  21. func main() {
  22. log.SetOutput(io.MultiWriter(os.Stdout))
  23. log.SetFlags(log.Lshortfile)
  24. my := Resume{"张三", "男"}
  25. log.Println(my)
  26. findTag(&my)
  27. }

输出

  1. main.go:33: {张三 男}
  2. main.go:22: tagInfo=name, tagDoc=name
  3. main.go:22: tagInfo=sex, tagDoc=sex

结构体标签在 JSON 中的应用

代码

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "io"
  6. "log"
  7. "os"
  8. )
  9. type User struct {
  10. Name string `json:"name"`
  11. Sex int `json:"sex" doc:"0女1男"`
  12. Phone int64 `json:"phone" doc:"11位手机号"`
  13. Children []string `json:"children"`
  14. }
  15. func main() {
  16. log.SetOutput(io.MultiWriter(os.Stdout))
  17. log.SetFlags(log.Lshortfile)
  18. u1 := User{}
  19. u1.Name = "母亲"
  20. u1.Sex = 0
  21. u1.Phone = 13800138000
  22. u1.Children = []string{"孩子1", "孩子2"}
  23. log.Println(u1)
  24. // JSON 编码过程, 结构体 --> josn
  25. jsonStr, err := json.Marshal(u1)
  26. if err == nil {
  27. log.Printf("jsonStr 数据类型 %T", jsonStr)
  28. log.Printf("jsonStr=%s\n", jsonStr)
  29. // 美化输出
  30. var out bytes.Buffer
  31. json.Indent(&out, jsonStr, "", "\t")
  32. log.Printf("\n%v\n", out.String())
  33. } else {
  34. log.Println("json 编码错误")
  35. }
  36. // 解码过程 jsonStr --> 结构体
  37. jsonStr2 := `{"name":"母亲","sex":0,"phone":13800138000,"children":["孩子1","孩子2"]}`
  38. log.Printf("jsonStr=%s\n", jsonStr2)
  39. u2 := User{}
  40. err = json.Unmarshal([]byte(jsonStr2), &u2)
  41. if err == nil {
  42. log.Printf("jsonStr 数据类型 %T", u2)
  43. log.Printf("u2=%v\n", u2)
  44. } else {
  45. log.Println("json 解码错误")
  46. }
  47. }

输出

  1. main.go:28: {母亲 0 13800138000 [孩子1 孩子2]}
  2. main.go:33: jsonStr 数据类型 []uint8
  3. main.go:34: jsonStr={"name":"母亲","sex":0,"phone":13800138000,"children":["孩子1","孩子2"]}
  4. main.go:39:
  5. {
  6. "name": "母亲",
  7. "sex": 0,
  8. "phone": 13800138000,
  9. "children": [
  10. "孩子1",
  11. "孩子2"
  12. ]
  13. }
  14. main.go:46: jsonStr={"name":"母亲","sex":0,"phone":13800138000,"children":["孩子1","孩子2"]}
  15. main.go:51: jsonStr 数据类型 main.User
  16. main.go:52: u2={母亲 0 13800138000 [孩子1 孩子2]}