10分钟上手Go语言结构体定义语法

简介: 10分钟上手Go语言结构体定义语法

/ Go 语言结构体定义详解 /

 

一、概述

结构体是 Go 语言中对数据进行抽象和封装的主要方法。本文将详细介绍 Go 语言中结构体的定义方式、创建和初始化、匿名字段等高级用法,并提供完整示例代码。

主要内容:

  • 结构体基本定义
  • 创建和初始化
  • 嵌套结构体
  • 匿名字段
  • 结构体标签
  • 可见性规则
  • 结构体方法
  • 结构体与 JSON
  • 结构体与反射

结构体是 Go 语言中复合数据类型的基石,全面掌握结构体的定义技巧,是编写易维护和扩展性强的 Go 代码的基础。


 

二、结构体基本定义

定义一个结构体需要使用 type 和 struct 关键字:

type Person struct {
  Name string
  Age  int
}

这定义了一个 Person 的结构体,有 Name 和 Age 两个字段。字段按定义顺序存储。

结构体字段上可以添加标签 tag,格式为:

FieldName tag

tag 通常用于添加元信息,可通过反射访问,常用于配置序列化。


 

三、创建和初始化

有以下几种创建结构体变量的方式:

p1 := Person{Name: "Tom", Age: 18} // 命名初始化
p2 := Person{Name: "Sam"} // 部分初始化
p3 := new(Person) // 取结构体指针
var p4 Person // 声明结构体变量

初始化时可以直接通过 Field:Value 形式初始化部分或全部字段。

new()返回对应的结构体指针,需要使用.成员访问符。还可以通过 var 声明来创建结构体变量。


 

四、嵌套结构体

结构体中可以嵌套包含另一个结构体,构成一个树形结构:

type Address struct {
  City string
  Province string
}
type User struct {
  Name string
  Gender string
  Address Address 
}

访问嵌套的结构体字段需要通过外层类型.内层类型进行访问:

user := User{
  Name: "Tom",
  Address: Address{
    City: "Beijing",
  }
}
city := user.Address.City

嵌套结构体是一个很有用的设计模式。


 

五、匿名字段

结构体可以使用匿名字段,即没有字段名的字段:

type Person struct {
  string
  int
}
p := Person{
  "Tom",
  20,
}

这里 string 和 int 就是匿名字段,在访问时直接使用类型名访问:

name := p.string // "Tom"
age := p.int // 20

匿名字段经常用于抽象定义,提高复用性。


 

六、结构体标签

前文提到结构体字段可以定义标签 tag:

type Person struct {
  Name string `json:"name"` 
  Age int `json:"age"`
}

tag 通常用于配置序列化等操作。多个 tag 可以叠加:

    Field string `json:"xxx" indo:"yyy"`

    常用的 tag 包括 json、xml、bson 等,这在和其他语言交互时非常有用。


     

    七、可见性规则

    结构体中的字段通过首字母大小写控制访问范围:

    • 大写开头的字段在包外可见(public)
    • 小写开头的字段仅包内可见(private)

    如果要在包外使用,必须通过提供 getter/setter 方法访问 private 字段:

    type Foo struct {
      publicField int
      privateField int
    }
    func (foo Foo) GetPrivate() int {
      return foo.privateField
    }
    func (foo Foo) SetPrivate(val int) {
      foo.privateField = val
    }

    这样通过方法访问 private 字段来控制可见性。


     

    八、结构体方法

    我们可以在结构体上定义方法。定义方法的格式如下:

    func (s Person) Eat() {
      // ...结构体方法
    }

    方法的接收者类型是结构体名 Person,方法名 Eat。

    调用时格式为:

    p := Person{} 
    p.Eat()

    方法作用于特定的接收者类型。不同类型,即使方法名相同,也属于不同方法。

    这就实现了基于结构体的面向对象编程。


     

    九、结构体与 JSON 序列化

    结构体经常需要序列化成 JSON 字符串传输或者保存:

    type Person struct {
      Name string `json:"name"`
      Age int `json:"age"`
    }
    p := Person{Name:"Tom", Age:20}
    data, _ := json.Marshal(p) // 序列化为JSON
    var p2 Person
    json.Unmarshal(data, &p2) // 反序列化为结构体

    这就是为什么结构体要定义 json 标签,用于指定序列化的字段名。


     

    十、结构体与反射

    反射可以让我们动态操作结构体字段和方法:

    type Foo struct {
      field1 string
      field2 int 
    }
    func main() {
      v := reflect.ValueOf(Foo{})
      // 遍历结构体字段
      for i := 0; i < v.NumField(); i++ {
        fmt.Println(v.Field(i))
      }
      // 获取字段值
      if v.FieldByName("field1").Kind() == reflect.String {
        fmt.Println("field1 is string")
      }
    }

    反射的应用可以消除代码对数据结构的依赖。


     

    十一、总结

    本文全面介绍了 Go 语言结构体的各种定义语法和技巧,包括嵌套结构体、匿名字段、结构体标签等高阶用法,并用示例代码演示了结构体的使用方式。

    结构体是 Go 语言中对数据进行抽象和封装的主要方法,熟练掌握结构体的各种技巧,可以编写出更加易维护和扩展性强的 Go 代码。


    目录
    相关文章
    |
    15天前
    |
    存储 监控 算法
    员工上网行为监控中的Go语言算法:布隆过滤器的应用
    在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
    58 8
    员工上网行为监控中的Go语言算法:布隆过滤器的应用
    |
    1月前
    |
    Go 开发工具
    百炼-千问模型通过openai接口构建assistant 等 go语言
    由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
    |
    1月前
    |
    程序员 Go
    go语言中结构体(Struct)
    go语言中结构体(Struct)
    104 71
    |
    1月前
    |
    存储 Go 索引
    go语言中的数组(Array)
    go语言中的数组(Array)
    107 67
    |
    10天前
    |
    算法 安全 Go
    Go 语言中实现 RSA 加解密、签名验证算法
    随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
    46 12
    |
    13天前
    |
    监控 算法 安全
    解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
    企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
    21 0
    |
    27天前
    |
    Go 数据安全/隐私保护 UED
    优化Go语言中的网络连接:设置代理超时参数
    优化Go语言中的网络连接:设置代理超时参数
    |
    1月前
    |
    存储 Go 索引
    go语言中数组和切片
    go语言中数组和切片
    42 7
    |
    1月前
    |
    Go 索引
    go语言for遍历数组或切片
    go语言for遍历数组或切片
    106 62
    |
    1月前
    |
    存储 Go
    go语言中映射
    go语言中映射
    39 11