zoukankan      html  css  js  c++  java
  • Go语言之数组

    一、数组简介

    数组是一种可以存放多个同一类型数据的数据类型,在Go中,数组是值类型。

    • 数组定义

    var 数组名 [数组大小]数据类型

    如:var a [5]int

    • 内存布局
    package main
    
    import "fmt"
    
    func main() {
    
        var intArr [3]int
        fmt.Println("intArr=", intArr)
    }
    /*
    intArr= [0 0 0]
    */

    对于上面的代码中,定义一个整型的、长度为3的数组,默认的数组值为0。

     可以通过赋值进行初始化,改变默认值。

    其中,数组的地址可以通过数组名称来获取 &intArr;数组的第一个元素的地址就是数组的地址;数组的各个元素的地址间隔一句数组的类型决定,比如 int64对应的数组元素地址间隔是8。

    二、数组使用

    (一)基本使用

    1、数组初始化

    package main
    
    import "fmt"
    
    func main() {
    
        // 数组初始化
        // 方式一
        var numArr1 [5]int = [5]int{1,2,3,4,5}
        // 方式二
        var numArr2 = [5]int{1,2,3,4,5}
        // 方式三
        var numArr3 = [...]int{1,2,3,4,5}
        // 方式四
        var numArr4 = [...]int{1:2, 0:1, 2:3, 3:4, 4:5}
        
        // 方式五 类型推导
        numArr5 := [...]string{"zhangsan", "lisi", "wangwu"}
        fmt.Println("numArr1", numArr1)
        fmt.Println("numArr2", numArr2)
        fmt.Println("numArr3", numArr3)
        fmt.Println("numArr4", numArr4)
        fmt.Println("numArr5", numArr5)
    
    }
    
    /*
    numArr1 [1 2 3 4 5]
    numArr2 [1 2 3 4 5]
    numArr3 [1 2 3 4 5]
    numArr4 [1 2 3 4 5]
    numArr5 [zhangsan lisi wangwu]
    */

    2、访问数组

    package main
    
    import "fmt"
    
    func main() {
    
        var intArr [3]int = [3]int{4, 5, 6}
    
        fmt.Println("第三个元素", intArr[2]) // 第三个元素 3
    
        for i := 0; i < len(intArr); i++ {
            fmt.Printf("第%d个元素=%d \n", i, intArr[i])
        }
        
    }
    /* 通过intArr[索引值]取值
    第0个元素=4 第1个元素=5 第2个元素=6
    */

    (二)for-range

    package main
    
    import "fmt"
    
    func main() {
    
        var intArr [3]int = [3]int{4, 5, 6}
    
        for i, v := range intArr {
            fmt.Printf("i=%v, v=%v \n", i, v)
        }
        
    }
    /*
    i=0, v=4 
    i=1, v=5 
    i=2, v=6
    */
    • i 数组的下标
    • v 是数组中i下标位置的值
    • i,v是for代码块中的局部变量
    • 如果忽略下标i,可以使用"_"

    (三)应用案例

    随机生成5个数,并将其反转打印。

    package main
    
    import (
        "fmt"
        "time"
        "math/rand"
     )
    
    func main() {
    
        var intArr [5]int
    
        len := len(intArr)
    
        rand.Seed(time.Now().UnixNano())
    
        for i := 0; i < len; i++ {
            intArr[i] = rand.Intn(100) // 生成 大于等于0,小于100的5个数
        }
    
        fmt.Println("交换前:", intArr)
    
        // 进行交换
        temp := 0
        for i := 0; i < len / 2; i++ {
            temp = intArr[len - 1 - i]
            intArr[len - 1 - i] = intArr[i]
            intArr[i] =temp
        }
        fmt.Println("交换后:", intArr)
        
    }
    /*
    交换前: [42 43 95 0 67]
    交换后: [67 0 95 43 42]
    */

    三、注意事项

    • 数组是多个相同类型数据的组合,一旦一个数组定义了,长度是固定的,不能动态变化
    • var arr []int 此时arr是一个slice切片
    • 数组中的元素可以是任何类型的数据,但是不能混用
    • 数组创建后,如果没有初始化赋值,数值默认值是0,字符串是"",bool数组是false
    • 使用数组的步骤,(1)声明数组并且开辟空间;(2)给数组各个元素赋值;(3)使用数组
    • 数组下标是从0开始的,如果越界使用会报错
    • Go中的数组是值类型,因此拷贝不会互相影响,如果需要改变之前的数组中的值,可以传入数组引用
    作者:iveBoy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Gitblit 的安装使用
    PLSQL 美化规则文件详解
    SQL Server Agent的作用
    使用C#创建Widows服务
    关于VS编译DevExpress默认产生几个多余的语言包的问题解决
    (转)查询A、B表中,A表中存在B表不存在的数据
    子类构造、析构时调用父类的构造、析构函数顺序
    ACCDB与MDB的读取区别
    vue中如何动态添加readonly属性
    windows下生成文件夹目录结构
  • 原文地址:https://www.cnblogs.com/shenjianping/p/15600497.html
Copyright © 2011-2022 走看看