博客
关于我
Golang复合类型
阅读量:795 次
发布时间:2019-03-25

本文共 3033 字,大约阅读时间需要 10 分钟。

Go语言复合数据类型解析

前言

在极早的文章中,我们深入探讨了 Go语言 的基本类型及其常见应用。次文将重点介绍 Go语言 中的复合数据类型,主要包含数组、切片、字典(map)和结构体(struct)的核心特性与使用场景。

文章目录

1. 数组

数组(Array)是 Go 中一种固定长度的数据序列,成员具有相同的数据类型。由于其固定长度特性,数组在实际编程中使用相对较少。但理解其特性对全面掌握 Go 开发环境至关重要。

数组特性

  • 数组长度需在编译时确定。
  • 数组类型与元素数据类型相关,例如 [3]int[4]int 是两种不同的数组类型。
  • Go 数组的索引从 0 开始,直到 len-1 结束。

数组声明

方式一:显式声明

var a [3]intvar q [3]int = [3]int{1, 2, 3}var r [3]int = [3]int{1, 2}  // 会填充未显式指定的元素为 0

方式二:自动长度 declaration

q := [...]int{1, 2, 3}

方式三:指定索引初始化

r := [...]int{    13: 21,    99: -1,}

切片声明与初始化

  • 切片与数组不同,其长度可变。
  • 切片底层基于数组实现,包含指针、长度和容量。
  • 切片不存在固定大小限制,支持动态扩展。

切片(Slice)

切片是 Go 中唯一的变长数组类型,成员元素具有相同的类型。其核心特性包括:

切片结构

  • 由三个部分构成:
    • 指针:指向切片数据的起始位置
    • 长度:切片元素总数
    • 容量:分配的内存总量

切片操作

  • 切片长度与容量通过 lencap 函数获取。
  • 切片可通过 make 函数创建,参数为:
    make(targetType, length, capacity)
  • 切片可基于现有数组进行切片或复制操作:
    s := [...]int{1, 2, 3, 4, 5}slice1 := s[1:3]   // 切片 [2, 3]slice2 := make([]int, 2)copy(slice2, slice1)

切片添加与删除

  • 动态增加元素:
    slice := []int{}slice = slice.append(4)slice = slice.append([]int{5, 6, 7}...)
  • 删除元素需手动操作,支持多种方式:
    a := a[1:]        // 删除第一个元素a = a[n:]         // 删除前n个元素a = a[:len(a)-1] // 删除最后一个元素

切片复制与反转

  • 切片复制为深拷贝:
    copy(t, s)
  • 切片反转可通过遍历实现:
    s := []int{1, 2, 3, 4, 5}for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {    s[i], s[j] = s[j], s[i]}

字典(Map)

字典(Map)是 Go 中的哈希表,用于存储键值对。其优势在于支持 O(1) 时间复杂度的增删查改。

字典特性

  • Key 必须是可比较类型,Value 可以是任意类型。
  • 内置 make 函数创建字典:
    map(structName) interfaceName
  • 字典缺失键处理:
    if exists, ok := map[key]; ok {    // 存在,进行操作}

字典操作

  • 字典初始化:
    age := make(map[string]int)age["Tony"] = 35
  • 删除操作不影响题干逻辑:
    delete(age, "Tony")

查询与迭代

  • 判断键存在与否:
    keyVal, ok := age["Tony"]if ok {    // 处理}
  • 迭代字典中的键值对:
    for key, value := range age {    fmt.Printf("%s: %d\n", key, value)}

结构体(Struct)

结构体(Struct)是一种将多个数据项聚合成为单个实体的数据类型。结构体的成员可通过字段访问符 (.) 运算符访问。

结构体 定义

type Employee struct {    id       int    name     string    address string    title    string}

结构体 初始化

  • 显式初始化:
    tony := Employee{    id:      3333,    name:    "Tony",    address: "Beijing",    title:   "Engineer",}
  • 匿名成员嵌入:
type Point struct { X, Y int }type Circle struct { Center Point; Radius int }type Wheel struct { Circle; Spokes int }

结构体 拷贝与指针

  • 结构体指针在函数传参中使用率高:
    func AwardAnnualRaise(e *Employee) {    e.Salary = e.Salary * 105 / 100}
  • 递归结构体:
    type Node struct { Value int; Left, Right *Node }
  • 结构体比较:
    if a == b {    // 比较成功}

格式化输出

  • 使用 %+v 格式化显示成员名称和值:
    type Info struct { Name string; ID int }v := Info{"Nan", 33}fmt.Printf("%+v\n", v)

其他复合类型

JSON 是流行的数据交换格式,可通过 encoding/json 包实现编码/解码。

JSON 编码(Marshaling)

  • 结构体标签:
    type Team struct { TeamID int `json:"team_id"` }
  • 编码实现:
    wallace := &Member{    ID:          1,    Name:        "Wallace",    Teams:       &Team{TeamID: 1, TeamName: "Team 1"},    Skills:      []string{"go", "mysql", "redis"},    Description: "test",}js, err := json.Marshal(wallace)

JSON 解码(Unmarshaling)

  • 解码实现:
    member := &Member{}err := json.Unmarshal(data, member)if err != nil {    // 处理错误}
  • 注意事项:初始化数组字段:
    type Member struct {    Skills []string `json:"skills"`}// 初始化为空member := &Member{Skills: make([]string, 10)}

结论

通过本文的学习,可以全面掌握 Go语言 中的数组、切片、字典和结构体的使用方法。这些复合数据类型是 Go 开发的基础能力,熟练掌握后将极大提升你的编程效率。

转载地址:http://phsyk.baihongyu.com/

你可能感兴趣的文章
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>
MySQL 错误
查看>>
mysql 随机数 rand使用
查看>>
MySQL 面试题汇总
查看>>
MySQL 面试,必须掌握的 8 大核心点
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
MySQL 高性能优化规范建议
查看>>
mysql 默认事务隔离级别下锁分析
查看>>
Mysql--逻辑架构
查看>>
MySql-2019-4-21-复习
查看>>
mysql-5.6.17-win32免安装版配置
查看>>
mysql-5.7.18安装
查看>>