golang之数组/切片(笔记)

27 阅读2分钟

声明数组

var cards [10] int
//声明一个下标长度为10的数组
var cards = [5]int{10,2,5,7,50}
cards := [5]int{10,2,5,7,50}
//声明的同时赋值数组
cards := [...]int{10,2,5,7,50}
//如果数组长度不确定,可以使用...代替数组的长度,编译器会根据元素个数自行推断数组的长度
cards := [...]int{1: 2, 3: 6, 5: 6}
//如果设置了数组的长度,还可以通过指定下标来初始化元素,结果为[0,2,0,6,0,6]
fmt.Println(cards[0])
//根据下标打印数组中的值

冒泡排序

冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据的交换逐步将无序列表排列为有序列表。

冒泡排序的基本原理是重复地循环遍历要排序的元素列,依次比较两个相邻的元素,如果顺序(如从小到大或者首字母从 Z 到 A)错误就把两个元素的位置交换过来,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

冒泡排序的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同气泡最终会上浮到顶端一样,故名“冒泡排序”。

package main

import "fmt"

func main() {
    var (
        num = [...]int{57, 76, 65, 43, 75, 89, 78}
        t   = len(num)
    )
    fmt.Println("没排序之前:\n", num)
    for i := 0; i < t; i++ {
        fmt.Println("第", i+1, "次冒泡")
        for j := 0; j < t; j++ {
            if num[i] < num[j] {
                sum := num[i]
                num[i] = num[j]
                num[j] = sum
            }
        }
        fmt.Println("排序之后.", num)

    }
    fmt.Println("从小到大排序依次为:\n", num)
}

运行结果

没排序之前:
 [57 76 65 43 75 89 78]
第 1 次冒泡
排序之后. [89 57 65 43 75 76 78]
第 2 次冒泡
排序之后. [57 89 65 43 75 76 78]
第 3 次冒泡
排序之后. [57 65 89 43 75 76 78]
第 4 次冒泡
排序之后. [43 57 65 89 75 76 78]
第 5 次冒泡
排序之后. [43 57 65 75 89 76 78]
第 6 次冒泡
排序之后. [43 57 65 75 76 89 78]
第 7 次冒泡
排序之后. [43 57 65 75 76 78 89]
从小到大排序依次为:
 [43 57 65 75 76 78 89]

多维数组

声明方式

var cards [下标][下标的下标]...[下标的下标的下标] int
var cards [2][2]int
cards := [][]int{}

获取数组长度

len(cards)
//cards是要获取长度的数组

数组之make切片

可以说Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

创建/生成切片的几种方式
//1、声明切片
var cards []int
cards := []int{}
//创建有3个值的切片
//cap是底层的长度由于当切片长度大于底层数组长度时,go会重新申请一个新的底层数组来存储数据,相当于cap*2
slice := make([]type, len, cap)
var cards []int = make([]int, 3)
var cards []int = make([]int, 0, 0)
//创建含有1,2,3的切片
var cards []int = []int{1, 2, 3}

fmt.Println(s4)

s5 := []int{1, 2, 3}

fmt.Println(s5)

// 5.从数组切片

arr := [5]int{1, 2, 3, 4, 5}

// 6、前包后不包
var s6 []int

s6 = arr[1:4]

fmt.Println(s6)

将值添加到切片末尾

cards := append(cards, "lisi")
cards := append(cards, "lisi", "liliu", "liqi")
//append用于向切片中添加元素,可以用于将一个值追加到一个切片的末尾。`append()` 函数会根据需要对切片进行扩容,以便能够放下新添加的元素。

将数组截取到切片

cards := [5]int{1, 2, 3, 4, 5}
var s6 []int
//前包后不包
s6 = cards[1:4]
fmt.Println(s6)
//结果为[2 3 4]

操作含义
s[n]切片s中索引位置为n的项
s[:]从切片s 的索引位置0到len(s)-1处所获得的切片
s[low:]从切片s的索引位置low到len(s)-1处所获得的切片
s[:high]从切片s的索引位置0到 high 处所获得的切片,len=high
s[low:high]从切片s的索引位置low到 high 处所获得的切片,len=high-low
s[low: high:max]从切片s的索引位置low到high 处所获得的切片,len=high-low,cap=max-low
len(s)切片s的长度,总是<=cap(s)
cap(s)切片s的容量,总是>=len(s)

字典类型map

var cards map[string]int
cards := map[string]string{"name":"zhangsan","address":"nanjing"}
var cards = map[string]string{
    "name": "zhangsan",
    "address": "nanjing",
}

var doMap = make(map[string]int, 100)//创建一个有100个值的切片
//创建一个字典:map表示字典类型,string名字类型,int是值的内容

fmt.Println(cards["name"])
//可以打印一下看一下效果

根据下标从map数组中删除

delete(cards,"name")
//cards是数组,"name"是下标

安全的给map添加值和删除值

var cards = sync.Map{}
//sync.Map{}是 Go 语言中创建一个线程安全的 map 变量 `cards` 的语法。它使用了 Go 语言的内置包 `sync` 中的 `Map` 类型。`sync.Map` 可以被多个 goroutine 安全地并发访问和修改,不需要使用额外的锁机制。可以将其作为一个并发安全的 key-value 数据库,用于多个 goroutine 之间共享数据。

cards.Store(key, n)
//Store用于在 map 中存储一个键值对,其中 `key` 表示键,`n` 表示值。这个方法会将键值对写入 map 中,如果 map 中已经存在该键,则会将其对应的值进行更新。`m.Store()` 方法是并发安全的,可以用在多个 goroutine 中同时对 map 进行操作。

value, _ := cards.Load(key)
//取出cards[key]并存放到value中

fmt.Println(key,value)