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 代码。


    目录
    相关文章
    |
    2天前
    |
    JavaScript Java Go
    探索Go语言在微服务架构中的优势
    在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
    |
    2天前
    |
    Ubuntu 编译器 Linux
    go语言中SQLite3驱动安装
    【11月更文挑战第2天】
    16 7
    |
    2天前
    |
    关系型数据库 Go 网络安全
    go语言中PostgreSQL驱动安装
    【11月更文挑战第2天】
    18 5
    |
    2天前
    |
    SQL 关系型数据库 MySQL
    go语言数据库中mysql驱动安装
    【11月更文挑战第2天】
    13 4
    |
    2天前
    |
    存储 设计模式 安全
    Go语言中的并发编程:从入门到精通###
    本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
    |
    1天前
    |
    安全 Go
    用 Zap 轻松搞定 Go 语言中的结构化日志
    在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
    9 1
    |
    3天前
    |
    关系型数据库 MySQL 数据库连接
    go语言中打开数据库连接
    【11月更文挑战第1天】
    13 2
    |
    9天前
    |
    Go 数据安全/隐私保护 开发者
    Go语言开发
    【10月更文挑战第26天】Go语言开发
    25 3
    |
    11天前
    |
    Java 程序员 Go
    Go语言的开发
    【10月更文挑战第25天】Go语言的开发
    21 3
    |
    3月前
    |
    JSON 中间件 Go
    go语言后端开发学习(四) —— 在go项目中使用Zap日志库
    本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
    125 1
    go语言后端开发学习(四) —— 在go项目中使用Zap日志库
    下一篇
    无影云桌面