Golang Struct 声明和使用

Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型

Struct 声明

具体的语法

  1. type identifier struct{
  2. field1 data_type
  3. field2 data_type
  4. field3 data_type
  5. }

例子

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type rectangle struct {
  6. length float64
  7. breadth float64
  8. color string
  9. }
  10. func main() {
  11. fmt.Println(rectangle{10.4, 25.10, "red"})
  12. }
struct 实例化的方法
  1. 点运算符

    可以使用点运算符访问结构体中的数据值
  1. type rectangle struct {
  2. length int
  3. breadth int
  4. color string
  5. geometry struct {
  6. area int
  7. perimeter int
  8. }
  9. }
  10. func main() {
  11. var rec rectangle
  12. rec.breadth = 19
  13. rec.length = 23
  14. rec.color = "Green"
  15. rec.geometry.area = rec.length * rec.breadth
  16. rec.geometry.perimeter = 2 * (rec.length + rec.breadth)
  17. fmt.Println(rec)
  18. fmt.Println("Area:\t", rec.geometry.area)
  19. fmt.Println("Perimeter:", rec.geometry.perimeter)
  20. }
  1. 使用 var关键词和 :=运算符

    如果初始化时,指定了特定的名称,那么有些字段是可以省略的
  1. type rectangle struct {
  2. length int
  3. breadth int
  4. color string
  5. }
  6. func main() {
  7. var rect1 = rectangle{10, 20, "Red"}
  8. fmt.Println(rect1)
  9. var rect2 = rectangle{length: 10, color: "Red"}
  10. fmt.Println(rect2)
  11. rect3 := rectangle{10, 20, "Green"}
  12. fmt.Println(rect3)
  13. rect4 := rectangle{length: 10, breadth: 20, color: "Green"}
  14. fmt.Println(rect4)
  15. rect5 := rectangle{breadth: 20, color: "Green"}
  16. fmt.Println(rect5)
  17. }
  1. 使用 new 关键字
  1. type rectangle struct {
  2. length int
  3. breadth int
  4. color string
  5. }
  6. func main() {
  7. rect1 := new(rectangle)
  8. rect1.length = 10
  9. rect1.breadth = 20
  10. rect1.color = "Green"
  11. fmt.Println(rect1)
  12. rect2 := new(rectangle)
  13. rect2.breadth = 20
  14. rect2.color = "Red"
  15. fmt.Println(rect2)
  16. }
  1. 使用 & 运算符
  1. type rectangle struct {
  2. length int
  3. breadth int
  4. color string
  5. }
  6. func main() {
  7. var rect1 = &rectangle{10, 20, "Red"} //此时不能省略任何值
  8. fmt.Println(rect1)
  9. var rect2 = &rectangle{}
  10. rect2.length = 10
  11. rect2.color = "Red"
  12. fmt.Println(rect2)
  13. var rect3 = &rectangle{}
  14. (*rect3).breadth = 20
  15. (*rect3).color = "Blue"
  16. fmt.Println(rect3)
  17. }
struct 练习
  1. struct中的tag标签
  1. type Employee struct {
  2. FirstName string `json:"firstname"`
  3. LastName string `json:"lastname"`
  4. City string `json:"city"`
  5. }
  6. func main() {
  7. json_str := `
  8. {
  9. "firstname":"Kevin",
  10. "lastname":"Woo",
  11. "city":"Beijing"
  12. }`
  13. emp1 := new(Employee)
  14. err := json.Unmarshal([]byte(json_str), emp1)
  15. if err != nil {
  16. fmt.Println(err)
  17. }
  18. fmt.Println(emp1)
  19. emp2 := new(Employee)
  20. emp2.FirstName = "John"
  21. emp2.LastName = "Lee"
  22. emp2.City = "Shanghai"
  23. jsonStr, _ := json.Marshal(emp2)
  24. fmt.Printf("%s", jsonStr)
  25. }

输出结果

  1. &{Kevin Woo Beijing}
  2. {"firstname":"John","lastname":"Lee","city":"Shanghai"}
  1. 内嵌的 struct 类型
  1. func main() {
  2. type Salary struct {
  3. Basic, HRA, TA float64
  4. }
  5. type Employee struct {
  6. FirstName, LastName, Email string
  7. Age int
  8. MonthlySalary []Salary
  9. }
  10. e := Employee{
  11. FirstName: "Kevin",
  12. LastName: "Woo",
  13. Email: "test@mail.com",
  14. Age: 12,
  15. MonthlySalary: []Salary{
  16. Salary{
  17. Basic: 15000.00,
  18. HRA: 5000.0,
  19. TA: 2000.0,
  20. },
  21. Salary{
  22. Basic: 16000.0,
  23. HRA: 6000.0,
  24. TA: 2100.0,
  25. },
  26. },
  27. }
  28. fmt.Println(e.FirstName,e.LastName)
  29. fmt.Println(e.Age)
  30. fmt.Println(e.Email)
  31. fmt.Println(e.MonthlySalary[0])
  32. fmt.Println(e.MonthlySalary[1])
  33. }

输出结果

  1. Kevin Woo
  2. 12
  3. test@mail.com
  4. {15000 5000 2000}
  5. {16000 6000 2100}
  1. struct 添加方法
  1. type Salary struct {
  2. Basic, HRA, TA float64
  3. }
  4. type Employee struct {
  5. FirstName, LastName, Email string
  6. Age int
  7. MonthlySalary []Salary
  8. }
  9. func (e Employee) EmpInfo() string {
  10. fmt.Println(e.FirstName, e.LastName)
  11. fmt.Println(e.Age)
  12. fmt.Println(e.Email)
  13. for _, info := range e.MonthlySalary {
  14. fmt.Println("=================")
  15. fmt.Println(info.Basic)
  16. fmt.Println(info.HRA)
  17. fmt.Println(info.TA)
  18. }
  19. return "-------------------"
  20. }
  21. func main() {
  22. e := Employee{
  23. FirstName: "Kevin",
  24. LastName: "Woo",
  25. Email: "test@mail.com",
  26. Age: 12,
  27. MonthlySalary: []Salary{
  28. Salary{
  29. Basic: 15000.00,
  30. HRA: 5000.0,
  31. TA: 2000.0,
  32. },
  33. Salary{
  34. Basic: 16000.0,
  35. HRA: 6000.0,
  36. TA: 2100.0,
  37. },
  38. },
  39. }
  40. fmt.Println(e.EmpInfo())
  41. }

输出结果

  1. Kevin Woo
  2. 12
  3. test@mail.com
  4. =================
  5. 15000
  6. 5000
  7. 2000
  8. =================
  9. 16000
  10. 6000
  11. 2100
  12. -------------------

Golang Struct 声明和使用的更多相关文章

  1. 【GoLang】GoLang struct 使用

    代码示例: package main import "fmt" type Human struct { name string age int weight int } type ...

  2. golang struct的使用

    Go struct tag深入理解 喜欢本站的朋友可以收藏本站,或者加入QQ群:172816590,我们大家一起来交流技术! 欢迎来到梁钟霖个人博客网站.本个人博客网站提供最新的站长新闻,各种互联网资 ...

  3. golang struct

    ex1 /* https://golangbot.com/structs/ struct 结构 结构就是一组字段. */ package main import "fmt" // ...

  4. [Golang] struct Tag说明

    在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct { UserId int `json:"use ...

  5. golang struct扩展函数参数命名警告

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...

  6. Golang struct结构

    结构struct Go中的struct与C中的struct非常相似,并且Go没有class,代替了class的位置,但并没有代替class的功能 使用type struct{} 定义结构,名称遵循可见 ...

  7. golang struct tag

    golang可以在struct中的每个字段,写上一个tag.这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化 package main import ( "enc ...

  8. golang变量声明

    func main() { var a1 int a1 = 1 var a = 1 b := 1 var c, d int c = 1 d = 1 var e, f = 1, 2 g, h := 1, ...

  9. golang struct 定义中json``解析说明

    在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下 package main import ( "enco ...

随机推荐

  1. 大数据入门到精通10--spark rdd groupbykey的使用

    //groupbykey 一.准备数据val flights=sc.textFile("data/Flights/flights.csv")val sampleFlights=sc ...

  2. 【bug小记】应用跳转白屏

    tv端项目 测试那边反馈我们的应用跳转到别的应用,再跳转回来会出现白屏的情况. 其实这个原因很简单,就是系统内存不足了把我们的app进程销毁了 所以再回到我们的应用的时候需要重新绘制,而这个" ...

  3. 二、putty的下载安装和基本使用方法教程

    转载自:https://baijiahao.baidu.com/s?id=1597811787635071952&wfr=spider&for=pc PuTTY是一款开源(Open S ...

  4. AI制作icon标准参考线与多面板复制

    新建10个25x25像素,色值为RGB的画板 在视图中打开显示网格 打开首选项参考线和网格,间隔和隔线都设为1 新建一个20x20像素前景色为空描边为1像素的正方形 选择对齐选项中的对齐画板,使之与画 ...

  5. Visual Studio2013 配置opencv3.3.0 x64系统

    注:小白一个,第一次写博客,可能会有一些理解上的错误,只此记录自己测试成功的坎坷之路,已备以后查看,同时给有需要之人. 我是win10 64 位,之前安装了visual studio 2013, 现在 ...

  6. 移动端web轮播图插件swiper,功能很强大

    使用方法示例: <div class="swiper-container"> <div class="swiper-wrapper"> ...

  7. 差分模版题(需理解才明白)AT2442 フェーン現象 (Foehn Phenomena)

    https://www.luogu.org/problemnew/show/AT2442 #include <bits/stdc++.h> #define read read() #def ...

  8. shell脚本监控系统负载、CPU和内存使用情况

    hostname >>/home/vmuser/xunjian/xj.logdf -lh >>/home/vmuser/xunjian/xj.logtop -b -n 1 | ...

  9. oracle表空间扩容方法

    1.使用navicat连接要扩容的数据库,进入其他-表空间 2.添加数据文件和设置配置项即可

  10. 7. The British Thached Roof 英国的茅草屋顶

    7. The British Thached Roof 英国的茅草屋顶 (1) The view over a valley of a tiny village with thatchd roof c ...