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]
}

数组使用步骤:

  1. 声明数组
  2. 给数组元素赋值
  3. 使用数组
  4. 数组索引从0开始,且不得越界否则panic
  5. Go数组是值类型,变量传递默认是值传递,因此会进行值拷贝
  6. 修改原本的数组,可以使用引用传递(指针),避免数据复制
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数组的更多相关文章

  1. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  2. JavaScript的json和Array及Array数组的使用方法

    1.关于json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集.也可以称为数据集和数组类似,能够存数据! //Ar ...

  3. iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)

    // // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...

  4. 多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量

    多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量,并且数组变量可以直接取到每一个元素var array1 = '<%=yearList =>'; ...

  5. c++中的array数组和vector数组

    我觉得实验一下会记得比较牢,话不多直接上代码. 下面是array数组,感觉用的不多. //cpp 风格数组 array #include <iostream> #include <a ...

  6. Java Script基础(八) Array数组对象

    一.Array数组 JavaScript中的数组也是具有相同数据类型的一个或者多个值得集合.用法和Java中的数组类似. Array对象的常用属性和方法: 属性: length:获取数组的长度: 方法 ...

  7. JavaScript string array 数组

    Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...

  8. php中foreach()函数与Array数组经典案例讲解

    //php中foreach()函数与Array数组经典案例讲解 function getVal($v) { return $v; //可以加任意检查代码,列入要求$v必须是数字,或过滤非法字符串等.} ...

  9. Javascript进阶篇——( JavaScript内置对象---下)--Array数组对象---笔记整理

    Array 数组对象数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的数组定义的方法: 1. 定义了一个空数组: var ...

  10. js Array数组的使用

    js Array数组的使用   Array是javascript中的一个事先定义好的对象(也可以称作一个类),可以直接使用 创建Array对象 var array=new Array(): 创建指定元 ...

随机推荐

  1. (一)PL/SQL简介

    PL/SQL PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编 ...

  2. 如何给 Inno Setup 生成的安装包添加版本信息

    使用 Inno 已有的函数 GetFileVersion 获取 EXE 文件的版本 #define ApplicationName 'Application Name' #define Applica ...

  3. opencv-3-图片存储与相对路径

    opencv-3-图片存储与相对路径 opencvqtC++ 在上一篇文章opencv 显示第一副图像 中, 我们完成了一副图像的显示, 包括使用VS,和QT 进行显示.. 本文将展示如何进行图像的显 ...

  4. HTML入门——互动式推送初尝试

    0.背景 疫情原因,导致许多大众喜闻乐见的体育活动停摆,但博主和队友们运营的体育社团公众号不能停摆.为了利用当下线上活动频率高的契机增加关注量,加之微信推送的互动性已成为趋势,博主打算和队友们尝试实现 ...

  5. Spring绑定请求参数过程以及使用@InitBinder来注册自己的属性处理器

    在工作中,经常会出现前台的请求参数由于无法被正常转型,导致请求无法进到后台的问题. 比如,我有一个User.其性别的属性被定义成了枚举,如下: public enum Gender { MALE(&q ...

  6. jQuery学习(三)

    事件 on方法可以将一个事件绑定在jQuery对象上,当你的操作触发了这些事件时,便会调用你所绑定的函数. 例如,给某个超链接绑定点击事件. <head> <meta http-eq ...

  7. LeetCode 98. 验证二叉搜索树 | Python

    98. 验证二叉搜索树 题目来源:https://leetcode-cn.com/problems/validate-binary-search-tree 题目 给定一个二叉树,判断其是否是一个有效的 ...

  8. Spring Boot 整合Web 层技术(整合Servlet)

    1 整合Servlet 方式一1.1通过注解扫描完成Servlet 组件的注册      1.1.1创建Servlet /*** 整合Servlet 方式一*/@WebServlet(name = & ...

  9. Spring Cloud 学习 之 Spring Cloud Eureka(概述)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 前述: ​ 服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务 ...

  10. Kafka的参数调优

    这篇文章主要说一下在生产过程中的kafka常用的调优参数, 首先kafka的版本是0.9.0.1,针对以下几个方面来说, 针对kafka的堆内存: 针对kafka的集群调优: kafka的的消息机制有 ...