惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Hacker News
The Hacker News
Martin Fowler
Martin Fowler
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
F
Full Disclosure
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
阮一峰的网络日志
阮一峰的网络日志
T
Threatpost
P
Privacy International News Feed
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
I
Intezer
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Privacy & Cybersecurity Law Blog
A
Arctic Wolf
博客园 - 聂微东
博客园 - 叶小钗
Cisco Talos Blog
Cisco Talos Blog
H
Help Net Security
S
Schneier on Security
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Exploit Database - CXSecurity.com
T
Tor Project blog
月光博客
月光博客
NISL@THU
NISL@THU
A
About on SuperTechFans
Spread Privacy
Spread Privacy
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
G
Google Developers Blog
W
WeLiveSecurity
P
Palo Alto Networks Blog
The Last Watchdog
The Last Watchdog
K
Kaspersky official blog
博客园 - 司徒正美
L
LINUX DO - 热门话题
小众软件
小众软件

博客园 - 悉野

ssh连结vmware中ubuntu的共享文件夹 spring加载冲突问题 spring一个错误修正 抓安卓日记到文件 注册表删除桌面顽固图标 github买的账号无法拉取代码的解决方法 apk常用命令 java服务器异常处理 ES6 学习难度分层 promise原理 材质, 纹理, shader之间的关系 TCP与UDP区别 javascript中=>与function的区别 javascript中函数解析过程 cocos使用fgui 几种服务注册与发现的区别 mybatis测试 向量点乘与叉乘 unity画布3种渲染模式 go学习笔记10(HTTP) go学习笔记9(TCP) go学习笔记8(反射) c++简单的线程池 operator new 是 C++ 动态内存分配的核心函数,负责分配原始内存,不调用构造函数 C++的定位放置new(Placement new) go学习笔记7(泛型,文件读写,测试) go学习笔记6(协程与channel,select使用,线程安全,异常处理) go学习笔记5(函数,结构体,自定义类型和类别名,接口) go学习笔记3(变量定义,输入输出,基本数据类型) go学习笔记2 laya打包的apk版本更新脚本 laya列表滚动问题 laya踩坑记 laya列表时计算具体体子项是列表中第几个 子弹射击 laya给自己画边框 查看laya已经加载的资源 laya spine事件
go学习笔记4(数组与切片,map,if,switch,for循环)
悉野 · 2026-04-05 · via 博客园 - 悉野

4.数组与切片

package main

import (
    "fmt"
    "reflect"
    "slices"
    "sort"
)

type User struct {
    name string
    age  int
}

func main() {
    arr := [3]int{1, 2, 3}
    slice := arr[1:2]
    fmt.Println(arr, len(arr), reflect.TypeOf(arr), "\n", slice, len(slice), reflect.TypeOf(slice))
    fmt.Println(slice)
    cc := append(slice, 1, 1)
    fmt.Println(slice) //slice值,长度不变
    fmt.Println(cc)

    var nullSlice []int
    //fmt.Println(nullSlice[0])
    var arr2 [0]int = [0]int{}
    fmt.Println(len(nullSlice), nullSlice == nil, reflect.TypeOf(nullSlice), reflect.TypeOf(arr2))
    //fmt.Println(arr2 == nil) 数组不能与nil判断, slice可以的
    arrList := [...]int{1, 7, 5, 4, 8} //数组与[3]int
    arrList2 := []int{}                //空切片 编译时创建
    arrList3 := make([]int, 0, 5)      //空切片 运行时动态创建 1.20+两者的效果差不多 ,长度为0, 初始为10, 可能传变量进来, 这样
    fmt.Println(len(arrList), arrList, arrList2, arrList3)
    //sort.Ints(arrList) //不支持数组直接排序, 要转成切片
    sort.Ints(arrList[:])                            // 转成切片再排序 从小到大排序
    sort.Sort(sort.Reverse(sort.IntSlice(arrList3))) //从大到小排序

    fmt.Println(len(arrList), arrList)
    arrList3 = append(arrList3, 4, 8, 6, 8, 7, 9)
    sort.Slice(arrList3, func(i, j int) bool {
        // func里面i,j是索引
        return arrList3[i] < arrList3[j]
    })
    // 源码中推荐使用slices.Sort, 而直接用sort.Ints调用
    slices.Sort(arrList3)
    slices.SortStableFunc(arrList3, func(i int, j int) int {
        // func里面i,j是具体对象
        return i - j
    })
    // 可以排对象
    users := []User{
        {"Jack", 30},
        {"Bobo", 20},
    }
    slices.SortFunc(users, func(a, b User) int {
        return a.age - b.age
    })

    fmt.Println(users)
}

5.map.go

package main

import "fmt"

// map映射字典, 是内部结构 无序的key-value, key为基础类型, value为任意类型, 使用前要初始化
func main() {
    var userMap = map[string]string{
        "A": "B",
        "B": "C",
        "4": "",
    }
    fmt.Println(userMap)
    // 显示出"4"对应的值
    fmt.Printf("%#v\n", userMap["4"])
    // 返回第一个是数值, 第二值是判断是否取到, 可为空
    val := userMap["A"]
    val, OK := userMap["E"]
    // 判断是否拿到
    fmt.Println(val, OK)
    delete(userMap, "B")
    fmt.Println(userMap)

    var aMap = make(map[string]string)
    var bMap = map[int]string{} //复杂类型要初始化, {}
    fmt.Println(aMap, bMap)
}

6.if,switch.go

package main

import "fmt"

func main() {
    a := 5
    if a < 3 {
        fmt.Println("a < 3")
    } else if a < 5 {
        fmt.Println("a < 5")
    } else {
        fmt.Println("a >=5")
    }

    //switch,支持两个判断, 用,分隔, 默认自带了类似break的效果
    switch a {
    case 1, 2:
        fmt.Println("1或2")
    case 3, 4, 5:
        fmt.Println("3,4,5")
        // fallthrough可以继续执行下面的判断
        fallthrough
    case 6:
        fmt.Println("6")
    default:
        fmt.Println("default")
    }
}

7.for循环.go

package main

import (
    "fmt"
    "maps"
    "sort"
    "time"
)

// 没有while, 只有后缀式i++, 没前缀写法
func main() {
    var sum int
    for i := 1; i < 10; i++ {
        sum += i
    }
    fmt.Println(sum)
    for {
        sum++
        if sum > 100 {
            break
        }
    }
    fmt.Println(sum)

    list := []string{
        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
    }
    for i := 0; i < len(list); i++ {
        fmt.Println(list[i])
    }
    //遍历
    for i, c := range list {
        fmt.Println(i, c)
    }

    userMap := map[string]string{
        "a": "b",
        "e": "f",
        "b": "c",
    }
    for k, v := range userMap {
        fmt.Println(k, v)
    }
    // 返回key的迭代器
    keysIter := maps.Keys(userMap)
    keys := make([]string, len(userMap))
    for k := range keysIter {
        keys = append(keys, k)
    }
    sort.Strings(keys)
    fmt.Println("keys:", keys)

    for {
        fmt.Println(time.Now())
        time.Sleep(time.Second)
    }
}