zoukankan      html  css  js  c++  java
  • 【go语言学习】数组array

    Go 语言提供了数组类型的数据结构。

    数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。

    数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组的下标取值范围是从0开始,到长度减1。

    数组一旦定义后,大小不能更改。

    一、数组定义

    需要指明数组的大小和存储的数据类型。
    var 数组变量名 [元素数量]T

    var arr[5]int //定义一个int类型长度为5的数组
    

    二、数组初始化

    数组的初始化有三种方法。

    1、使用指定的值完成初始化
    var numArry = [3]int{1, 2, 3}
    var cityArry = [3]string{"北京", "上海", "深圳"}
    
    2、根据初始值的个数自行推断数组的长度
    var numArry = [...]int{1, 2, 3}
    var cityArry = [...]string{"北京", "上海", "深圳"}
    
    3、使用指定索引值的方式来初始化数组
    numArry := [...]int{0: 1, 2: 3} //[1 0 3]
    var cityArry = [...]string{0: "北京", 1: "深圳"} //["北京" "" "深圳"]
    

    三、数组的遍历

    数组的长度len(arr)可以得到数组的长度
    数组的遍历可以用for循环或for range循环

    arr := [...]int{1, 2, 3}
    for i := 0; i < len(arr); i++ {
        fmt.Println(i, arr[i])
    }
    
    arr := [...]int{1, 2, 3}
    for k, v := range arr {
        fmt.Println(k, v)
    }
    

    运行结果

    0 1
    1 2
    2 3
    

    四、多维数组

    Go语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。

    arr1 := [2][3]int{
        {1, 2, 3},
        {4, 5, 6},
    }
    arr2 := [2][2]string{{"北京", "上海"}, {"苏州", "无锡"}}
    fmt.Println(arr1)//[[1 2 3] [4 5 6]]
    fmt.Println(arr2)//[[北京 上海] [苏州 无锡]]
    

    注意: 多维数组只有第一层可以使用...来让编译器推导数组长度。

    多维数组的遍历:
    for遍历

    package main
    
    import "fmt"
    
    func main() {
    	cityArry := [2][2]string{{"北京", "上海"}, {"苏州", "无锡"}}
    	for i := 0; i < len(cityArry); i++ {
    		for j := 0; j < len(cityArry[i]); j++ {
    			fmt.Printf("第%v行, 第%v列的值为%v
    ", i+1, j+1, cityArry[i][j])
    		}
    	}
    }
    

    运行结果

    第1行, 第1列的值为北京
    第1行, 第2列的值为上海
    第2行, 第1列的值为苏州
    第2行, 第2列的值为无锡
    

    for range遍历

    package main
    
    import "fmt"
    
    func main() {
    	numArry := [2][3]int{{1, 2, 3}, {4, 5, 6}}
    	for k1, v1 := range numArry {
    		for k2, v2 := range v1 {
    			fmt.Printf("第%v行,第%v列的值为%v
    ", k1+1, k2+1, v2)
    		}
    	}
    }
    

    运行结果

    第1行,第1列的值为1
    第1行,第2列的值为2
    第1行,第3列的值为3
    第2行,第1列的值为4
    第2行,第2列的值为5
    第2行,第3列的值为6
    

    五、数组是值类型

    Go语言中的数组是值类型,而不是引用类型。赋值和传参会复制整个数组。因此改变副本的值,不会改变数组本身的值。

    a := [...]int{1, 2, 3}
    b := a
    b[0] = 100
    fmt.Println(a)//[1 2 3]
    fmt.Println(b)//[100 2 3]
    

    数组的大小是类型的一部分。因此[5]int和[10]int是不同的类型。

    package main
    
    func main() {  
        a := [5]int{1, 2, 3, 4, 5}
        var b [10]int
        b = a //cannot use a (type [5]int) as type [10]int in assignment
    }
    

    六、数组排序

    go分别提供了sort.Float64s() sort.Strings() sort.Ints() 对不同类型的数组进行排序,默认是升序。降序需要使用sort.Reverse

    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    func main() {
    	intArry := [...]int{12, 2, 23, 44, 22, 10}
    	floatArry := [...]float64{12.1, 2.4, 23.4, 45.1, 22.5, 10.7}
    	stringArry := [...]string{"abc", "ab", "bc"}
    	// 升序排列
    	sort.Ints(intArry[:])
    	sort.Float64s(floatArry[:])
    	sort.Strings(stringArry[:])
    	fmt.Println(intArry)
    	fmt.Println(floatArry)
    	fmt.Println(stringArry)
    	// 降序排列
    	sort.Sort(sort.Reverse(sort.IntSlice(intArry[:])))
    	sort.Sort(sort.Reverse(sort.Float64Slice(floatArry[:])))
    	sort.Sort(sort.Reverse(sort.StringSlice(stringArry[:])))
    	fmt.Println(intArry)
    	fmt.Println(floatArry)
    	fmt.Println(stringArry)
    }
    

    运行结果

    [2 10 12 22 23 44]
    [2.4 10.7 12.1 22.5 23.4 45.1]
    [ab abc bc]
    [44 23 22 12 10 2]
    [45.1 23.4 22.5 12.1 10.7 2.4]
    [bc abc ab]
    
  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/everydawn/p/13880543.html
Copyright © 2011-2022 走看看