数组

简介

  数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组不可以动态增长和收缩元素个数。数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的。

 

声明

var variable_name [SIZE] variable_type

初始化

package main

import "fmt"

func main() {
// 第一种方式 []中的数值与{}中的个数要保持一致
var list1 = [4] int{1, 2, 3, 4}
fmt.Println(list1)
// 第二种方式 根据{}中元素个数设置数组大小
var list2 = [...] string{"a","b","c","d"}
fmt.Println(list2)
// 第三种方式 []中的数值与{}中的个数要保持一致
list3 := [4] float32{1.1,2.2,3.3,4.4}
fmt.Println(list3)
} //[1 2 3 4]
//[a b c d]
//[1.1 2.2 3.3 4.4]

元素的值

package main

import "fmt"

func main() {
list := [4] int{1,2,3,4}
fmt.Println(list)
// 数组交换 修改元素
list[0],list[1] = list[1],list[0]
fmt.Println(list)
} //[1 2 3 4]
//[2 1 3 4]

 

遍历

package main

import "fmt"

func main() {
list := [4]string {"a","b","c","d"}
// 获取下标与值
for i,v := range list{
fmt.Println(i)
fmt.Println(v)
}
// 忽略迭代时的下标
var times [5][0]int
for range times {
fmt.Println("hello")
} } //0
//a
//1
//b
//2
//c
//3
//d
//hello
//hello
//hello
//hello
//hello

 空数组

var d [0]int       // 定义一个长度为0的数组
var e = [0]int{} // 定义一个长度为0的数组
var f = [...]int{} // 定义一个长度为0的数组

  

赋值

Go语言中数组是值语义。一个数组变量即表示整个数组,它并不是隐式的指向第一个元素的指针(比如C语言的数组),而是一个完整的值。当一个数组变量被赋值或者被传递的时候,实际上会复制整个数组。如果数组较大的话,数组的赋值也会有较大的开销

package main

import "fmt"

func main() {
list1 := [4] int{1,2,3,4}
list2 := list1
// 赋值 拷贝整个数组的内存
fmt.Printf("list1 %p\n",&list1)
fmt.Printf("list2 %p\n",&list2)
} //list1 0xc000054140
//list2 0xc000054160

赋值生成的数组与原数组互不影响

package main

import "fmt"

func main() {
list1 := [4] int{1,2,3,4}
list2 := list1
// 赋值的数组之间互不影响
list1[0] = 10
fmt.Printf("list1 %d\n",list1)
fmt.Printf("list2 %d\n",list2)
} //list1 [10 2 3 4]
//list2 [1 2 3 4]

内置函数len可以用于计算数组的长度,cap函数可以用于计算数组的容量。不过对于数组类型来说,lencap函数返回的结果始终是一样的,都是对应数组类型的长度。

package main

import "fmt"

func main() {
list := [4]string {"a","b","c","d"}
// len cap
fmt.Printf("len=%d cap=%d slice=%v\n",len(list),cap(list),list)
} //len=4 cap=4 slice=[a b c d]

函数传参

数组作为参数进行函数传递时,数组会进行内存拷贝(与赋值一样),在函数中对参数数组进行修改操作时,不会对外部数组有任何影响

package main

import "fmt"

// 传参时指定数组的size
func change(list [4]int){
// 数组作为参数时会拷贝内存
fmt.Printf("list %p\n",&list)
// 对数组进行修改
list[0] = 100
} func main() {
list := [4] int{1,2,3,4}
fmt.Printf("list %p\n",&list)
change(list)
// list 不受影响
fmt.Println(list)
} //list 0xc000054140
//list 0xc000054180
//[1 2 3 4]

  

数组地址与元素地址

数组在内存中时连续的,并且数组变量的地址与数组第一个元素地址一致

package main

import "fmt"

func main() {
list := [4] int{1,2,3,4}
// 内存地址一致
fmt.Printf("list %p\n",&list)
fmt.Printf("list %p\n",&list[0])
} //list 0xc00000e380
//list 0xc00000e380

  

数组进行切片,生成的切片与数组

生成的切片与数组同下标元素的内存地址一致,修改值后相互影响

package main

import "fmt"

func main() {
list := [] int{1,2,3,4}
slice := list[:]
// 同下标的切片元素的数组元素地址一致
fmt.Printf("list[0] %p\n",&list[0])
fmt.Printf("list[0] %p\n",&slice[0])
// 修改元素的值相互影响
slice[0] = 10
fmt.Println(list)
fmt.Println(slice)
list[0] = 20
fmt.Println(list)
fmt.Println(slice)
} //list[0] 0xc000054140
//list[0] 0xc000054140
//[10 2 3 4]
//[10 2 3 4]
//[20 2 3 4]
//[20 2 3 4]

  

  

Go语言【数据结构】数组的更多相关文章

  1. 【算法】C语言实现数组的动态分配

    C语言实现数组的动态分配 作者:白宁超 2016年10月27日20:13:13 摘要:数据结构和算法对于编程的意义不言而喻,具有指导意义的.无论从事算法优化方向研究,还是大数据处理,亦或者网站开发AP ...

  2. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  3. go语言学习-数组-切片-map

    数组 go语言中数组的特点: 数组的长度是固定的,并且长度也是数组类型的一部分 是值类型,在赋值或者作为参数传递时,会复制整个数组,而不是指针 定义数组的语法: var arr1 = [5]int{1 ...

  4. 【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装

    [送给在路上的程序猿] 对于一个开发人员而言,可以胜任系统中随意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并能够运用到系统中.由此简化系统的开发,是其架构生涯的第一步. ...

  5. go语言之数组

    1.go语言的数组和python的列表不一样,python的列表没有限定类型,而go的数组限定的类型,理由是这样的,请看下面的图 go语言的数组会数组中第一个值的内存地址,在我们上面的例子中,数组中的 ...

  6. (js描述的)数据结构 [数组的一些补充](1)

    (js描述的)数据结构 [数组的一些补充](1) 1. js的数组: 1.优点:高度封装,对于数组的操作就是调用API 2.普通语言的数组: 1.优点:根据index来查询,修改数据效率很高 2.缺点 ...

  7. C语言局部数组大小与内存的栈的关系

    今天有个同学问了一个问题,我居然答不上来,为什么不能开局部整型二维数组[1000][1000]?但是在数组前面加上一个static就可以了? windows下栈的大小(不是数据结构里面的栈)是2MB, ...

  8. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  9. go语言的 数组、slice、map使用(转)

    golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...

  10. go语言 类型:数组

    在go语言中数组array是一组特定长度的有序的元素集合. go的数组类型由两部分组成——类型和长度,二者缺一不可.数组本来就是一块存储相同类型元素的连续内存空间,因此决定一个数组的类型,必然需要决定 ...

随机推荐

  1. Apache ServiceComb Pack 微服务分布式数据最终一致性解决方案

    https://github.com/OpenSagas-csharp/servicecomb-pack-csharp Saga基本使用指南 使用前置条件说明 如果还有同学对Saga还不甚了解的同学, ...

  2. 用于C# 的异步,持久的键值存储 Akavache 使用

    Akavache是​​一个异步的,持久的(即写入磁盘)键值存储,用于在C#中编写桌面和移动应用程序,基于SQLite3.Akavache非常适合存储重要数据(即用户设置)以及过期的缓存本地数据. 开源 ...

  3. 洛谷P1352 没有上司的舞会题解

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  4. .net web.config中配置字符串中特殊字符的处理

    https://www.cnblogs.com/zzmzaizai/archive/2008/01/30/1059191.html 如果本身字符串中有特殊字符,如分号,此时就需要用单引号整体包裹起来, ...

  5. 运行虚拟机报错:CPU acceleration status: HAXM is not installed on this machine

    运行虚拟机报错:CPU acceleration status: HAXM is not installed on this machine. 这是因为SDKmanage没有安装HAXM ,于是打开S ...

  6. numpy的文件存储.npy .npz 文件详解

    Numpy能够读写磁盘上的文本数据或二进制数据. 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...

  7. cookie 设置报错 setcookie() expects parameter 3 to be integer, float given in...

    使用 setcookie 函数设置 cookie 报错,报错信息为: setcookie() expects parameter to be integer, float given in... 错误 ...

  8. spring MVC cors跨域实现源码解析 CorsConfiguration UrlBasedCorsConfigurationSource

    spring MVC cors跨域实现源码解析 spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议 ...

  9. Error-Javascript:错误:页面文档类型(DOCTYPE)未声明!

    ylbtech-Error-Javascript:错误:页面文档类型(DOCTYPE)未声明! 1.返回顶部 1. HTML1300: 进行了导航.文件: TransferNote.aspxHTML1 ...

  10. Could not create connection to database server. Attempted reconnect 3 times. Giving up.

    报出这个错误,可能原因: 1.检查MySQL数据库服务是否正常(包含检查服务名和密码),如果不正常,修复至正常为止: 2.maven工程中导入的mysql的jar版本和你的MySQL版本不相符,必须相 ...