首页后端开发GOGo语言入门之数据结构详细介绍以及代码示例(go语言 数据结构)

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

时间2023-03-24 17:32:04发布访客分类GO浏览713
导读:Go语言是一种静态类型、编译型语言,支持面向对象、过程式和函数式编程风格。它的语法简洁、易于理解,特别适合于开发网络服务和分布式系统。Go语言标准库提供了丰富的数据结构和算法,包括数组、切片、映射、链表、栈、队列、堆、树等常用数据结构。本文...

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

  1. 数组

数组是一种固定长度、相同类型的数据结构,用于存储一组有序的元素。在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
  1. 切片

切片是一种动态长度的、可变的、引用类型的数据结构,用于存储一组有序的元素。在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 // 修改切片中的一个元素
  1. 映射

映射是一种无序的、键值对的数据结构,用于存储一组有序的元素。在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
  1. 链表

链表是一种动态的、可变的、引用类型的数据结构,用于存储一组有序的元素。在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
  1. 队列

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

Copy

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

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

go数据结构链表入门数组

若转载请注明出处: Go语言入门之数据结构详细介绍以及代码示例(go语言 数据结构)
本文地址: https://pptw.com/jishu/308.html
ChIP-seq 分析:基因集富集(11) 一款为热门数据库系统打造的管理客户端,更具生产力的数据库工具

游客 回复需填写必要信息