前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言入门之数据结构详细介绍以及代码示例

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

原创
作者头像
疯狂的KK
发布2023-03-20 11:07:20
4580
发布2023-03-20 11:07:20
举报
文章被收录于专栏:Java项目实战Java项目实战

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

  1. 数组

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

Copy

代码语言:javascript
复制
var a [5]int // 定义一个长度为5的整型数组

数组的初始化方式有两种:

Copy

代码语言:javascript
复制
var a [5]int = [5]int{1, 2, 3, 4, 5} // 定义并初始化数组
var b = [5]int{1, 2, 3, 4, 5} // 根据初始化值自动推断数组长度

数组的元素可以使用下标访问和修改,例如:

Copy

代码语言:javascript
复制
a[0] = 10 // 修改数组第一个元素
fmt.Println(a[0]) // 输出10

数组的长度可以使用len()函数获取,例如:

Copy

代码语言:javascript
复制
fmt.Println(len(a)) // 输出5
  1. 切片

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

Copy

代码语言:javascript
复制
var a []int // 定义一个整型切片

切片的初始化方式有三种:

Copy

代码语言:javascript
复制
a := []int{1, 2, 3} // 直接初始化切片
b := make([]int, 3) // 使用make()函数创建指定长度的切片
c := make([]int, 3, 5) // 使用make()函数创建指定长度和容量的切片

切片的长度和容量可以使用len()和cap()函数获取,例如:

Copy

代码语言:javascript
复制
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

代码语言:javascript
复制
a[0] = 10 // 修改切片第一个元素
fmt.Println(a[0]) // 输出10

切片的添加、删除、修改等操作可以使用内置函数实现,例如:

Copy

代码语言:javascript
复制
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 // 修改切片中的一个元素
  1. 映射

映射是一种无序的、键值对的数据结构,用于存储一组有序的元素。在Go语言中,映射的键和值可以是任意类型,映射的定义方式如下:

Copy

代码语言:javascript
复制
var a map[string]int // 定义一个字符串键和整型值的映射

映射的初始化方式有两种:

Copy

代码语言:javascript
复制
a := make(map[string]int) // 使用make()函数创建一个空的映射
b := map[string]int{"one": 1, "two": 2, "three": 3} // 定义并初始化一个映射

映射的元素可以使用键访问和修改,例如:

Copy

代码语言:javascript
复制
a["one"] = 1 // 添加一个键值对
fmt.Println(a["one"]) // 输出1
a["one"] = 0 // 修改一个键值对
fmt.Println(a["one"]) // 输出0

映射的删除操作可以使用内置函数实现,例如:

Copy

代码语言:javascript
复制
delete(a, "one") // 删除一个键值对

映射的长度可以使用len()函数获取,例如:

Copy

代码语言:javascript
复制
fmt.Println(len(a)) // 输出0
fmt.Println(len(b)) // 输出3
  1. 链表

链表是一种动态的、可变的、引用类型的数据结构,用于存储一组有序的元素。在Go语言中,链表由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的定义方式如下:

Copy

代码语言:javascript
复制
type Node struct {
    data int
    next *Node
}

var head *Node // 定义一个链表头指针

链表的插入、删除、查找等操作可以使用头指针实现,例如:

Copy

代码语言:javascript
复制
// 插入一个节点到链表末尾
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
  1. 队列

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

Copy

代码语言:javascript
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档