• Go语言之数组与切片基础


    一、数组

    数组是同一类型元素的集合,可以放多个值,但是类型一致,内存中连续存储

    Go 语言中不允许混合不同类型的元素,而且数组的大小,在定义阶段就确定了,不能更改

    1、数组的定义

    // 定义一个大小为3的string类型和int8类型的数组,里面可以放3个字符串和3个数字
    var names [3]string
    var ages [3]int8
    fmt.Println(names, ages)	// 输出:[  ] [0 0 0]
    

    2、数组赋值

    var ages [3]int8
    ages[0] = 18
    ages[2] = 22
    
    fmt.Println(ages)
    fmt.Println(ages[1])
    
    // 输出
    [18 0 22]
    0
    

    3、定义并初始化

    // 方式一:
    var ages [3]int = [3]int{1, 2, 3}
    fmt.Println(ages)	// 输出:[1 2 3]
    
    // 方式二:
    var ages = [3]int{1, 2, 3}
    fmt.Println(ages)	// 输出:[1 2 3]
    
    // 方式三:...后面放几个值,数组大小就是多少
    var ages = [...]int{1, 2, 3, 4, 5, 6, 7, 8}
    fmt.Println(ages)	// 输出:[1 2 3 4 5 6 7 8]
    
    // 方式四:
    ages := [...]int{1, 2, 3, 4, 8}
    fmt.Println(ages)	// 输出:[1 2 3 4 8]
    

    4、数组的大小是类型的一部分

    var a [2]int = [2]int{1, 2}
    var b [2]int = [2]int{1, 3}
    
    b = a  // 如果不是同一种类型,不允许相互赋值
    fmt.Println(b)
    

    5、数组是值类型

    因为数组是值类型,Go 函数传参,都是 copy 传递,如果是值类型,函数内改了,不会影响原来的

    var a = [2]int{1, 2}
    fmt.Println(a)	// [1 2]
    test(a)		// [99 2]
    fmt.Println(a)	// [1 2]
    
    
    func test(a [2]int) {
    	a[0] = 99
    	fmt.Println(a)
    }
    

    6、数组长度 len() 数组长度在定义阶段已经固定

    var a = [2]int{1, 2}	
    fmt.Println(len(a))		// 输出:2
    

    7、数组循环

    // 普通循环
    var a = [...]int{7, 6, 5, 4, 3, 2, 1}
    for i := 0; i < len(a); i++ {
       fmt.Println(a[i])
    }
    
    
    // 通过 range 来循环(range不是一个内置函数,是一个关键字如:for,if,else)
    // 如果用一个变量接收,这个值是可迭代的索引
    // 如果用两个变量接收,这两个变量一个是索引,一个是具体的值
    var a = [...]int{7, 6, 5, 4, 3, 2, 1}
    for i, value := range a {
        fmt.Println(i)	// 索引
        fmt.Println(value)	// 值
    }
    
    // 不要索引只要值循环打印
    for _, value := range a {
    	fmt.Println(value)
    }
    

    8、多维数组

    var a [3][3]int // 定义
    a[0][1] = 20	// 使用
    fmt.Println(a)	// 输出:[[0 20 0] [0 0 0] [0 0 0]]
    
    
    // 定义并赋初始值
    var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}
    fmt.Println(a)	// 输出:[[1 0 0] [2 3 4] [5 6 0]]
    
    
    // 循环多维数组
    var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}
    for _, value := range a {
       for _, inValue := range value {
          fmt.Println(inValue)
       }
    }
    

    9、数组定义并指定位置初始化

    // 在索引为5和7的位置指定初始化值
    var ages [10]int = [10]int{5: 55, 7: 77}
    fmt.Println(ages)	// 输出:[0 0 0 0 0 55 0 77 0 0]
    

    二、切片基础

    切片是由数组建立的一种方案、灵活且功能强大的包装(Wrapper)。

    它本身不拥有任何数据,只对现有数组的引用。

    1、切片的定义

    // 定义一个数组
    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    // 基于数组,做一个切片
    b := a[:]
    
    fmt.Println(b)			// 输出:[9 8 7 6 5 4 3 2 1 0]
    fmt.Printf("%T", b)		// 输出:[]int		中括号中不带东西,就是切片类型
    
    fmt.Println(a)			// 输出:[9 8 7 6 5 4 3 2 1 0]
    fmt.Printf("%T", a)		// 输出:[10]int
    

    2、使用切片

    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    b := a[:]
    
    fmt.Println(b[0])	// 输出:9
    fmt.Println(b[2])	// 输出:7
    

    3、修改切片,会影响数组

    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    b := a[:]
    b[0] = 99	// 修改切片
    
    fmt.Println(b)	// 输出:[99 8 7 6 5 4 3 2 1 0]
    // 数组会被修改
    fmt.Println(a)	// 输出:[99 8 7 6 5 4 3 2 1 0]
    

    4、修改数组也会影响切片

    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    b := a[:]
    a[1] = 99	// 修改数组
    
    fmt.Println(a)	// 输出:[9 99 7 6 5 4 3 2 1 0]
    // 切片也会被修改
    fmt.Println(b)	// 输出:[9 99 7 6 5 4 3 2 1 0]
    

    5、切片只切数组的一部分

    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    b := a[3:6]
    
    // 修改切片
    b[0] = 66
    fmt.Println(b)		// 输出:[66 5 4]
    fmt.Println(a)		// 输出:[9 8 7 66 5 4 3 2 1 0]
    
    // 修改数组
    a[4] = 55
    fmt.Println(b)		// 输出:[66 55 4]
    fmt.Println(a)		// 输出:[9 8 7 66 55 4 3 2 1 0]
    

    6、当多个切片共用相同的底层数组时,每个切片所做的更改将反应在数组中

    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    b := a[3:5]
    c := a[4:6]
    fmt.Println(a) // 输出:[9 8 7 6 5 4 3 2 1 0]
    fmt.Println(b) // 输出:[6 5]
    fmt.Println(c) // 输出:[5 4]
    b[1] = 555
    fmt.Println(a) // 输出:[9 8 7 6 555 4 3 2 1 0]
    fmt.Println(b) // 输出:[6 555]
    fmt.Println(c) // 输出:[555 4]
    

    7、切片的长度和容量

    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    b := a[3:7]
    
    fmt.Println(b) // 输出:[6 5 4 3]
    fmt.Println(a) // 输出:[9 8 7 6 5 4 3 2 1 0]
    
    // 切片长度
    fmt.Println(len(b))    // 输出:4
    // 切片容量(我最多能存多少值,从切片的起始位置开始往后所有的,从索引为3开始)
    fmt.Println(cap(b))    // 输出:7
    

    8、切片追加值

    var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
    b := a[6:8]
    
    b = append(b,11)
    b = append(b,22)
    fmt.Println(a) // 输出:[9 8 7 6 5 4 3 2 11 22]
    
    // 追加到临界点了在追加
    b = append(b,33)
    b = append(b,44)
    fmt.Println(a) // 输出:[9 8 7 6 5 4 3 2 11 22]
    fmt.Println(b) // 输出:[3 2 11 22 33 44]
    
    // 数组长度不会在变了,他会在原来基础上翻倍,把我原来那个值copy到我新的数组上a和b已经没有关系了
    b[0] = 33
    fmt.Println(b) // 输出:[33 2 11 22 33 44]
    fmt.Println(a) // 输出:[9 8 7 6 5 4 3 2 11 22]
    
    学习之旅
  • 相关阅读:
    Google Map Api V3 系列之 导航(包括清除线路)
    ENSP学习华为防火墙功能
    让Chrome 浏览器显示隐藏的https和www
    win7 x64 SP1把IE从8升级到11的先决条件
    解决“Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足……”
    火绒软件没有离线病毒库独立安装包的解决方法
    成功注册GitHub20211116
    网络基础知识积累
    【问题解决】win10连接了不可路由的以太网后,会阻止使用 WWAN 访问 Internet
    ENSP学习华为防火墙(第二天,20211127 )
  • 原文地址:https://www.cnblogs.com/XiaoYang-sir/p/15375931.html
Copyright © 2020-2023  润新知