Go语言入门之数据结构详细介绍以及代码示例

简介: Go语言是一种静态类型、编译型语言,支持面向对象、过程式和函数式编程风格。它的语法简洁、易于理解,特别适合于开发网络服务和分布式系统。Go语言标准库提供了丰富的数据结构和算法,包括数组、切片、映射、链表、栈、队列、堆、树等常用数据结构。本文将详细介绍Go语言中常用的数据结构,包括定义、初始化、插入、删除、查找、排序等操作,并提供代码示例。

Go语言是一种静态类型、编译型语言,支持面向对象、过程式和函数式编程风格。它的语法简洁、易于理解,特别适合于开发网络服务和分布式系统。Go语言标准库提供了丰富的数据结构和算法,包括数组、切片、映射、链表、栈、队列、堆、树等常用数据结构。本文将详细介绍Go语言中常用的数据结构,包括定义、初始化、插入、删除、查找、排序等操作,并提供代码示例。

数组
数组是一种固定长度、相同类型的数据结构,用于存储一组有序的元素。在Go语言中,数组的长度是在定义时确定的,不能动态改变。数组的下标从0开始,最大下标为数组长度减1。数组的定义方式如下:

Copy

var a [5]int // 定义一个长度为5的整型数组
复制
数组的初始化方式有两种:

Copy

var a [5]int = [5]int{1, 2, 3, 4, 5} // 定义并初始化数组
var b = [5]int{1, 2, 3, 4, 5} // 根据初始化值自动推断数组长度
复制
数组的元素可以使用下标访问和修改,例如:

Copy

a[0] = 10 // 修改数组第一个元素
fmt.Println(a[0]) // 输出10
复制
数组的长度可以使用len()函数获取,例如:

Copy

fmt.Println(len(a)) // 输出5
复制
切片
切片是一种动态长度的、可变的、引用类型的数据结构,用于存储一组有序的元素。在Go语言中,切片是对数组的封装,它的长度可以动态调整,支持添加、删除、修改等操作。切片的定义方式如下:

Copy

var a []int // 定义一个整型切片
复制
切片的初始化方式有三种:

Copy

a := []int{1, 2, 3} // 直接初始化切片
b := make([]int, 3) // 使用make()函数创建指定长度的切片
c := make([]int, 3, 5) // 使用make()函数创建指定长度和容量的切片
复制
切片的长度和容量可以使用len()和cap()函数获取,例如:

Copy

fmt.Println(len(a)) // 输出3
fmt.Println(cap(a)) // 输出3
fmt.Println(len(b)) // 输出3
fmt.Println(cap(b)) // 输出3
fmt.Println(len(c)) // 输出3
fmt.Println(cap(c)) // 输出5
复制
切片的元素可以使用下标访问和修改,例如:

Copy

a[0] = 10 // 修改切片第一个元素
fmt.Println(a[0]) // 输出10
复制
切片的添加、删除、修改等操作可以使用内置函数实现,例如:

Copy

a = append(a, 4) // 在切片末尾添加一个元素
a = append(a, 5, 6, 7) // 在切片末尾添加多个元素
a = append([]int{0}, a...) // 在切片开头添加一个元素
a = append([]int{-3, -2, -1}, a...) // 在切片开头添加多个元素
a = append(a[:2], a[3:]...) // 删除切片中的一个元素
a[1] = 0 // 修改切片中的一个元素
复制
映射
映射是一种无序的、键值对的数据结构,用于存储一组有序的元素。在Go语言中,映射的键和值可以是任意类型,映射的定义方式如下:

Copy

var a map[string]int // 定义一个字符串键和整型值的映射
复制
映射的初始化方式有两种:

Copy

a := make(map[string]int) // 使用make()函数创建一个空的映射
b := map[string]int{"one": 1, "two": 2, "three": 3} // 定义并初始化一个映射
复制
映射的元素可以使用键访问和修改,例如:

Copy

a["one"] = 1 // 添加一个键值对
fmt.Println(a["one"]) // 输出1
a["one"] = 0 // 修改一个键值对
fmt.Println(a["one"]) // 输出0
复制
映射的删除操作可以使用内置函数实现,例如:

Copy

delete(a, "one") // 删除一个键值对
复制
映射的长度可以使用len()函数获取,例如:

Copy

fmt.Println(len(a)) // 输出0
fmt.Println(len(b)) // 输出3
复制
链表
链表是一种动态的、可变的、引用类型的数据结构,用于存储一组有序的元素。在Go语言中,链表由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的定义方式如下:

Copy

type Node struct {

data int
next *Node

}

var head *Node // 定义一个链表头指针
复制
链表的插入、删除、查找等操作可以使用头指针实现,例如:

Copy

// 插入一个节点到链表末尾
func insertToEnd(head Node, data int) Node {

node := &Node{data: data}
if head == nil {
    return node
}
cur := head
for cur.next != nil {
    cur = cur.next
}
cur.next = node
return head

}

// 删除一个节点
func deleteNode(head Node, data int) Node {

if head == nil {
    return nil
}
if head.data == data {
    return head.next
}
cur := head
for cur.next != nil {
    if cur.next.data == data {
        cur.next = cur.next.next
        return head
    }
    cur = cur.next
}
return head

}

// 查找一个节点
func searchNode(head *Node, data int) bool {

if head == nil {
    return false
}
cur := head
for cur != nil {
    if cur.data == data {
        return true
    }
    cur = cur.next
}
return false

}
复制

栈是一种先进后出的数据结构,用于存储一组有序的元素。在Go语言中,栈可以使用数组或链表实现。栈的定义方式如下:

Copy

type Stack struct {

data []int

}

func (s *Stack) Push(x int) {

s.data = append(s.data, x)

}

func (s *Stack) Pop() int {

if len(s.data) == 0 {
    return -1
}
x := s.data[len(s.data)-1]
s.data = s.data[:len(s.data)-1]
return x

}

func (s *Stack) Top() int {

if len(s.data) == 0 {
    return -1
}
return s.data[len(s.data)-1]

}

func (s *Stack) IsEmpty() bool {

return len(s.data) == 0

}
复制
栈的操作包括入栈、出栈、查看栈顶元素和判断栈是否为空,例如:

Copy

s := Stack{}
s.Push(1) // 入栈1
s.Push(2) // 入栈2
fmt.Println(s.Top()) // 输出2
fmt.Println(s.Pop()) // 出栈2
fmt.Println(s.Pop()) // 出栈1
fmt.Println(s.IsEmpty()) // 输出true
复制
队列
队列是一种先进先出的数据结构,用于存储一组有序的元素。在Go语言中,队列可以使用数组或链表实现。队列的定义方式如下:

type Queue struct {

data []int

}

func (q *Queue) Enqueue(x int) {

q.data = append(q.data, x)

}

func (q *Queue) Dequeue() int {

if len(q.data
目录
相关文章
|
7天前
|
Go
掌握Go语言:Go语言错误处理,从基础到高级,让你的代码更健壮!(33)
掌握Go语言:Go语言错误处理,从基础到高级,让你的代码更健壮!(33)
|
8天前
|
算法 C语言
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)
8 0
|
8天前
|
算法 C语言
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
9 0
|
8天前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
8 0
|
8天前
|
算法 Shell C语言
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)
10 0
|
8天前
|
人工智能 算法 C语言
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
7 0
|
8天前
|
算法 C语言
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
7 0
|
8天前
|
存储 算法 测试技术
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
13 1
|
8天前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
9 1
|
8天前
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
6 1
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)