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(): 创建指定元 ...
随机推荐
- [Inno Setup] 在 File Section 之前解压文件
Prototype: procedure ExtractTemporaryFile(const FileName: String); Description: Extracts the specifi ...
- Add text to 'Ready Page' in Inno Setup
https://stackoverflow.com/questions/1218411/add-text-to-ready-page-in-inno-setup
- 再也不用c刷题了!!——c++刷题必备
致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者.由于水平有限,博客中难免会有一些错误 ...
- Autofac的切面编程实现
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能
业务场景 在使用Element UI的Table组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...
- 图论--网络流--最大流 洛谷P4722(hlpp)
题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...
- 图论--割边--Tarjan模板
#include<iostream> #include<stdio.h> #include<vector> using namespace std; const i ...
- MYSQL数据库配置安装、重置密码以及工具连接
一.下载mysql安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 下载解压好之后,就是一个文件夹的形式. 二.配置环境变量 环境变量的配置,就是把MyS ...
- 【漫画】JAVA并发编程三大Bug源头(可见性、原子性、有序性)
原创声明:本文转载自公众号[胖滚猪学编程] 某日,胖滚猪写的代码导致了一个生产bug,奋战到凌晨三点依旧没有解决问题.胖滚熊一看,只用了一个volatile就解决了.并告知胖滚猪,这是并发编程导致的 ...
- 2019-2020Nowcoder Girl初赛 题解
题目都不是很难,就是最后一题有点毒瘤 第一题:牛妹爱整除 这个你把一个进制数进行拆分,拆分成若干位,然后在取模,这样会发现如果是x进制的数,那么对x+1这个进制转化即满足条件. 举个例子:一个x进制数 ...