3.8 Go Array数组
3.8 Go Array数组
数组是固定长度
的特定类型元素
组成的序列
。
一个数组由零或多个相同类型
元素组成。
数组的长度是固定,因此Go更常用Slice(切片,动态增长或收缩序列)。
数组是值类型,用索引
下标访问每个元素,范围是0~len(数组)-1
,访问越界会panic异常
注意:赋值
和传参
是复制整个数组
而不是指针
//接收数组参数
func test(x [2]int){
fmt.Printf("x: %p,%v\n",&x,x)
} //对数组赋值语句
func main(){
a:=[2]int{10,20}
var b [2]int//初始化数组b
b=a//a的值复制拷贝给b
fmt.Printf("a: %p,%v\n",&a,a)
fmt.Printf("b: %p,%v\n",&b,b) test(a)
}
实例
package main import (
"fmt"
) func main() {
/*
定义数组
var 数组名 [数组大小]数据类型
var a1 [5]int 定义数组后,5个元素都有默认值 0 数组赋值方式
a[0]=1
a[1]=2 数组的第一个元素的地址,就是数组的首地址
数组各个元素地址间隔根据数组的数据类型决定,int64 8字节 int32 4字节
*/
var intArr [5]int
fmt.Println("intArr默认值是:", intArr)
intArr[0] = 1
intArr[1] = 2
intArr[2] = 3
fmt.Println("intArr赋值后的值是:", intArr)
fmt.Printf("intArr数组地址是=%p\n", &intArr)
fmt.Printf("intArr数组第一个元素地址是=%p\n", &intArr[0])
fmt.Printf("intArr数组第二个元素地址是=%p\n", &intArr[1])
fmt.Printf("intArr数组第三个元素地址是=%p\n", &intArr[2]) //(全局声明)
//声明赋值方式 一
var a1 [5]string = [5]string{"大猫", "二狗"}
//自动类型推导,未赋值的有默认值
var a2 = [5]int{1, 2, 3}
//自动判断数组长度 二
var a3 = [...]int{1, 2, 3, 4, 5}
//指定索引赋值元素 三
var a4 = [...]string{3: "狗蛋", 6: "猫屎"}
//结构体类型数组 四
var a5 = [...]struct {
name string
age int
}{
{"王麻子", 10},
{"吕秀才", 29},
}
fmt.Println(a1)
fmt.Println(a2)
fmt.Println(a3)
fmt.Println(a4)
fmt.Println(a5)
}
运行结果
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/yuchao/go #gosetup
/usr/local/go/bin/go build -o /private/var/folders/dd/1j1pbw895772hqp2d2gfg00c0000gn/T/___go_build_main_go /Users/yuchao/go/src/gostudy/gobook/main.go #gosetup
/private/var/folders/dd/1j1pbw895772hqp2d2gfg00c0000gn/T/___go_build_main_go #gosetup
intArr默认值是: [0 0 0 0 0]
intArr赋值后的值是: [1 2 3 0 0]
intArr数组地址是=0xc42001c090
intArr数组第一个元素地址是=0xc42001c090
intArr数组第二个元素地址是=0xc42001c098
intArr数组第三个元素地址是=0xc42001c0a0
[大猫 二狗 ]
[1 2 3 0 0]
[1 2 3 4 5]
[ 狗蛋 猫屎]
[{王麻子 10} {吕秀才 29}] Process finished with exit code 0
1.1. 遍历数组
package main import "fmt" func main() {
var a1 = [...]int{1, 2, 3, 4, 5, 6}
//通过索引取值
for i := 0; i < len(a1); i++ {
fmt.Println(a1[i])
} //for循环遍历数组,索引和值,index可以省略用占位符_
for index, value := range a1 {
fmt.Println(index, value)
} }
1.2. 数组使用细节
package main import "fmt" func main() {
//数组是多个相同类型数据的组合,且长度固定,无法扩容
var a1 [3]int
a1[0] = 1
a1[1] = 11
//必须赋值int类型数据,否则报错
//a1[2] = 111.1 //不得超出索引
//a1[3]=111
fmt.Println(a1)//有默认值[1 11 0]
}
数组使用步骤:
- 声明数组
- 给数组元素赋值
- 使用数组
- 数组索引从0开始,且不得越界否则panic
- Go数组是值类型,变量传递默认是值传递,因此会进行值拷贝
- 修改原本的数组,可以使用引用传递(指针),避免数据复制
package main import (
"fmt"
) //函数接收值类型,默认有值拷贝
func test(arr [3]int) {
arr[0] = 66
} //函数修改原本数组,需要使用引用传递
func test2(arr *[3]int) {
(*arr)[0] = 66 //可以缩写arr[0]=66 编译器自动识别,arr是指针类型
} func main() {
//声明arr数组,需要考虑传递函数参数时,数组的长度一致性
arr := [3]int{11, 22, 33}
//test函数不会修改数组
test(arr)
fmt.Println(arr)
//test2修改了数组
test2(&arr)
fmt.Println(arr)
}
1.3. 指针数组,数组指针
指针数组: 元素为指针类型的数组
func ptrArray() {
//定义数组,元素类型是*int,
var ptrArray [5]*int
fmt.Println(ptrArray) //[<nil> <nil> <nil> <nil> <nil>]
//需要传入地址
a1 := [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(a1); i++ {
ptrArray[i] = &a1[i] //循环写入内存地址
}
fmt.Println(ptrArray)
//输出指针数组的值
for i := 0; i < len(ptrArray); i++ {
fmt.Println(*ptrArray[i])
}
} func main() {
ptrArray()
}
数组指针: 获取变量数组变量的地址
func main() {
//数组是值类型,可以用new函数创建 数组指针,类型是*[5]int
//数组指针,指向数组的地址
//数组中存的是值类型
var array1 = new([5]int)
array1[0] = 66
array1[1] = 77
fmt.Println(reflect.TypeOf(array1))
fmt.Println(array1[0])
}
3.8 Go Array数组的更多相关文章
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- JavaScript的json和Array及Array数组的使用方法
1.关于json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集.也可以称为数据集和数组类似,能够存数据! //Ar ...
- iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)
// // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...
- 多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量
多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量,并且数组变量可以直接取到每一个元素var array1 = '<%=yearList =>'; ...
- c++中的array数组和vector数组
我觉得实验一下会记得比较牢,话不多直接上代码. 下面是array数组,感觉用的不多. //cpp 风格数组 array #include <iostream> #include <a ...
- Java Script基础(八) Array数组对象
一.Array数组 JavaScript中的数组也是具有相同数据类型的一个或者多个值得集合.用法和Java中的数组类似. Array对象的常用属性和方法: 属性: length:获取数组的长度: 方法 ...
- JavaScript string array 数组
Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...
- php中foreach()函数与Array数组经典案例讲解
//php中foreach()函数与Array数组经典案例讲解 function getVal($v) { return $v; //可以加任意检查代码,列入要求$v必须是数字,或过滤非法字符串等.} ...
- Javascript进阶篇——( JavaScript内置对象---下)--Array数组对象---笔记整理
Array 数组对象数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的数组定义的方法: 1. 定义了一个空数组: var ...
- js Array数组的使用
js Array数组的使用 Array是javascript中的一个事先定义好的对象(也可以称作一个类),可以直接使用 创建Array对象 var array=new Array(): 创建指定元 ...
随机推荐
- PHP实现MySQL并发查询
一般的,一个看似很简单的页面,一次http请求后,到达服务端,穿过Cache层,落到后台后,实际可能会有很多很多的数据查询逻辑!而这些查询实际是不相互依赖的,也即可以同时查询.比如各种用户信息,用户的 ...
- VIM 批量缩进4个空格
vim /etc/vimrc 或 vim ~/.vimrc set smartindent set shiftwidth= 按v选中多行,回车 然后shifit + >
- Python 基础教程(第二版)笔记 (1)
P22 除非对 input 有特别的需要,否则应该尽可能使用 raw_input 函数. 长字符串,跨多行,用三个引号代替普通引号.并且不需要使用反斜线进行转义. P23 原始字符串 print r' ...
- Linux 用户管理和提权
Linux ⽀持多个⼈使⽤同⼀个⽤户登录系统, Windows 在修改组策略的情况下,也可以多个⼈使⽤同⼀个⽤户登录 远程连接Linux的⽅式:SSH协议 远程连接Windows的⽅式:RDP协议 安 ...
- 图论--Dijkstra算法总结
Key word: ①BFS转换Dijkstra ②其他关系转化为最短路 ③反向建边及反向Dijkstra ④稠密图.稀疏图 ⑤链式前向星 ⑥Vector建图 ⑦超级源点&汇点 详解: 1.B ...
- D. Distance in Tree(树型Dp计数)
\(其实思路都能想到一点,就是去重这里特别麻烦,没有好的思路.\) \(设dp[i][j]为以i为根深度为j的节点数量\) \(dp[parent][j]=\sum{dp[son][j-1]}\) \ ...
- dp cf 20190615
A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...
- EditPlus编辑java代码 常规配置
- 选择结构(if、switch)
3.2 用if语句实现选择结构 什么是选择结构 单分支if语句 双分支if语句 多分支if语句 1.什么是选择结构? 选择结构又称为分支结构,是根据给定的条件是否成立来决定程序的执行流程. 用if语 ...
- 201771030120-王嫄 实验一 软件工程准备 <课程学习目的思考>
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 这个作业要求链接 https://www.cnblogs.com/nwnu- ...