Go语言基础之数组

摘要:
本文主要介绍数组及其基本用法。数组是相同数据类型的元素的集合。在Go语言中,数组是从声明时确定的,使用时可以修改数组成员,但不能更改数组大小。基本的syntax://Define一个数组avara[3],长度为3个元素,int类型int array的定义:var array variable name[number of elements]T例如:vara[5]int,数组的长度必须是常量,长度是数组类型的一部分。一旦定义,长度
Go语言基础之数组

本文主要介绍数组(array)及它的基本使用。

Array(数组)

数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法:

// 定义一个长度为3元素类型为int的数组a
var a [3]int

数组定义:

var 数组变量名 [元素数量]T

比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。 [5]int[10]int是不同的类型。

数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。

数组的初始化

初始化数组时可以使用初始化列表来设置数组元素的值。

func main() {
    var testArray [3]int
    var numArray = [3]int{1, 2}
    var cityArray = [3]string{"北京", "上海", "深圳"}
    fmt.Println(testArray) //[0 0 0]
    fmt.Println(numArray)  //[1 2 0]
    fmt.Println(cityArray) //[北京 上海 深圳]
}

这样写每次都要确保提供的初始值和数组长度一致,但是一般情况下我们只需要让编译器根据初始值的个数自行推断数组的长度,例如:

func main() {
    var testArray [3]int
    var numArray = [...]int{1, 2}
    var cityArray = [...]string{"北京", "上海", "深圳"}
    fmt.Println(testArray) //[0 0 0]
    fmt.Println(numArray)  //[1 2]
    fmt.Println(cityArray) //[北京 上海 深圳]
}

我们还可以使用指定索引值的方式来初始化数组,例如:

func main() {
    a := [...]int{1: 1, 3: 5}
    fmt.Println(a)                  // [0 1 0 5]
    fmt.Printf("type of a:%T
", a) //type of a:[4]int
}

数组的遍历

遍历数组a有以下两种方法:

// 方法1:for循环遍历
for i := 0; i < len(a); i++ {
    fmt.Println(a[i])
}

// 方法2:range遍历
for index, v := range a {
    fmt.Println(index, v)
}

注意: 1. 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。 2. 支持 “==“、”!=” 操作符,因为内存总是被初始化过的。 3. 指针数组 [n]*T,数组指针 *[n]T。

多维数组

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

二维数组的定义

func main() {
    a := [3][2]string{
        {"北京", "上海"},
        {"广州", "深圳"},
        {"成都", "重庆"},
    }
    fmt.Println(a) //[[北京 上海] [广州 深圳] [成都 重庆]]
    fmt.Println(a[2][1]) //支持索引取值:重庆
}

二维数组的遍历

func main() {
    a := [3][2]string{
        {"北京", "上海"},
        {"广州", "深圳"},
        {"成都", "重庆"},
    }
    for _, v1 := range a {
        for _, v2 := range v1 {
            fmt.Printf("%s	", v2)
        }
        fmt.Println()
    }
}
输出:
北京    上海    
广州    深圳    
成都    重庆    
注意: 多维数组只有第一层可以使用...来让编译器推导数组长度。例如:
//支持的写法
a := [...][2]string{
    {"北京", "上海"},
    {"广州", "深圳"},
    {"成都", "重庆"},
}
//不支持多维数组的内层使用...
b := [3][...]string{
    {"北京", "上海"},
    {"广州", "深圳"},
    {"成都", "重庆"},
}

数组是值类型

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。

func modifyArray(x [3]int) {
    x[0] = 100
}

func modifyArray2(x [3][2]int) {
    x[2][0] = 100
}
func main() {
    a := [3]int{10, 20, 30}
    modifyArray(a) //在modify中修改的是a的副本x
    fmt.Println(a) //[10 20 30]
    b := [3][2]int{
        {1, 1},
        {1, 1},
        {1, 1},
    }
    modifyArray2(b) //在modify中修改的是b的副本x
    fmt.Println(b)  //[[1 1] [1 1] [1 1]]
}
注意:
数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
[n]*T表示指针数组,*[n]T表示数组指针 。

免责声明:文章转载自《Go语言基础之数组》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jmeter上传图片附件实践python魔法方法、构造函数、序列与映射、迭代器、生成器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

STM32(13)——SPI

简介:   SPI,Serial Peripheral interface串行外围设备接口。   接口应用在:EEPROM, FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。   特点:高速的、全双工、同步的通信总线、占用4根线;可以同时发生和接收串行数据;可以当做主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护...

在Tomcat服务器中启动SpringBoot项目原理(简化版)

总的来说,tomcat方式启动WAR包项目, tomcat会查询context上下文中实现ServletContainerInitializer接口的类,然后调用类的onStartup(Set<Class<?>> c, ServletContext ctx)方法 Spring的SpringServletContainerInitia...

ajax(省,市,县)三级联动

下面我们用Jquery,ajax,做一个省,市,县的三级联动: 下面是我做三级联动下拉的步骤以及逻辑 第一步:先做一个省市区表格 第二步:建个PHP页面显示用我是在<body>里放<div>用来接收要显示的省市区表格信息,里面嵌入jquery-1.11.2.min.js和自己封装的三联动省市区的方法 第三步:写封装方法用JS 第四...

python 爬虫_PyQuery详细用法

总结:语法和JQuery一样 1. 初始化 from pyquery import PyQuery as pq #用pq代替pyquery doc=pq(html) print(doc('li')) #字符串的初始化 from pyquery import PyQuery as pq...

第三节:Vue3向下兼容2(v-for、数组方法、v-model、计算属性、监听器)

一. 基本指令  1. v-for 数据准备 data() { return { userInfo: { name: 'ypf', age: 18, school: '北大' }, movies: ["星际穿越",...

前端 --- 关于DOM的介绍

111 什么是DOM DOM:文档对象模型。DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。目的其实就是为了能让js操作html元素而制定的一个规范。 DOM就是由节点组成的。 解析过程 HTML加载完毕,渲染引擎会在内存中把HTML文档,生成一个DOM树,getElementById是获取内中DOM上的元素节点。然后操作的时候修改的...