数组(array)就是由若干个相同类型的元素组成的序列。

var ipv4 [4]uint8 = [4]uint8(192,168,0,1)

在这条赋值语句中,我们为刚声明的变量ipv4赋值。在这种情况下,变量名右边的类型字面量可以省略。
如果它在函数里面,那么关键字var也可以省略,但赋值符号必须由=变为:=。

类型字面量[4]uint8表明这个变量的类型长度为4且元素类型为uint的数组类型。
注意,数组的长度是数组类型的一部分。
只要类型声明中的数组长度不同,即两个数组类型的元素类型相同,它们也是不同的类型。
更重要的是,一旦在声明中确定了数组类型的长度,就无法改变它了。
同时,同一类型的数组可以使用操作符==、!=。

package main

import "fmt"

var d0 [2]int //d0是数组类型的变量,因此也要遵循变量使用原则,全局变量可以只定义不使用,但是局部变量不行。

func main() {
var d1 [3]int
var d2 [2]int
fmt.Println(d1 == d2) //invalid operation: d1 == d2 (mismatched types [3]int and [2]int)长度不同 d3 := [2]int{1, 2}
d4 := [2]int{2, 3}
fmt.Println(d3 != d4) //true }

数组初始化的方式比较灵活。
数组类型的零值一定是一个不包含任何元素的空数组。
一个类型的零值即为该类型变量未被显式赋值时的默认值。

package main

import "fmt"

func main() {
var a [3]int b := [4]int{2, 3} c := [4]int{5, 3: 10} d := [...]int{1, 2, 3} e := [...]int{3, 4, 4: 9} fmt.Println(a) //[0 0 0] int类型的元素默认值为0
fmt.Println(b) //[2 3 0 0] 位提供初始化的元素自动使用默认值
fmt.Println(c) //[5 0 0 10] 3:10表示元素10是数组的第4个元素
fmt.Println(d) //[1 2 3] 省略长度,但不是没有,编译器按照初始化元素的数量确定长度
fmt.Println(e) //[3 4 0 0 9] }

对于结构等复杂类型,可省略元素初始化类型标签。

package main

import "fmt"

func main() {
type user struct {
name string
age int
} d := [...]user{
{"kebi", 26}, //省略类型标签
{"maoxian", 24},
} fmt.Println(d) //[{kebi 26} {maoxian 24}]
}

在定义多维数组时,仅第一维数组可以使用"..."。
内置函数len和cap都只能返回第一维度的长度。

package main

import "fmt"

func main() {
a := [2][3]int{
{1, 2, 3},
{4, 5},
} b := [...][2]int{
{4, 2},
{3, 4},
} fmt.Println(a, len(a), cap(a))
fmt.Println(b, len(b), cap(b))
} /*
[[1 2 3] [4 5 0]] 2 2
[[4 2] [3 4]] 2 2
*/

要注意区分指针数组和数组指针。
指针数组:元素为指针类型的数组;数组指针:获取数组变量的指针。

package main

import "fmt"

func main() {
a := [...]int{1, 2, 3}
fmt.Println(&a) //数组没有指针,只有数组的元素才有指针,数组只是对底层元素的包装
fmt.Println(&a[0], &a[1]) //数组指针 0xc00004c0c0 0xc00004c0c8 x, y := 10, 20
b := [2]*int{&x, &y} //指针数组
fmt.Println(b) [0xc00004c0c0 0xc00004c0c8]
}

通过指针可以反取数据。

package main

import "fmt"

func main() {
a := [2]int{1, 2}
p := &a
fmt.Println(*p) //[1 2]
}

Go数组是值类型,复制和传参都会复制整个数组。
数组的指针是数组中第一个元素的指针。
数组是内层中某个连续的片段,复制和赋值都会在此分配片段,这属于值复制,指针也不同。

package main

import "fmt"

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 = a //复制 fmt.Printf("a: %p, %v\n", &a, a) //a: 0xc00004e080, [10 20]
fmt.Printf("b: %p, %v\n", &b, b) //b: 0xc00004e090, [10 20]
test(a) //传参//x: 0xc00004e0f0, [10 20]
fmt.Println(&a[0], &a[1]) //0xc00004e080 0xc00004e088
fmt.Println(&b[0], &b[1]) //0xc00004e090 0xc00004e098
}

如果需要,可改用指针或切片,这样就可以避免复制,以此可以减少资源的消耗。

package main

import "fmt"

func test(x *[2]int) {
fmt.Printf("x: %p, %v\n", x, *x)
} func main() {
a := [2]int{10, 20}
test(&a) //直接传递的是指针,这样就避免复制 fmt.Printf("a: %p, %v\n", &a, a)
} /*
x: 0xc00004e080, [10 20]
a: 0xc00004e080, [10 20]
*/

当需要详细规划程序所用的内存时,数组类型非常有用。
使用数组值可以完全避免耗时费力的内存二次分配操作,因为它的长度是不可改变的。

go——数组的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

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

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

  5. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  6. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  7. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  8. javascript数组查重方法总结

    文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  10. 小兔JS教程(四)-- 彻底攻略JS数组

    在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...

随机推荐

  1. 简单而直接的Python web 框架:web.py

    web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限制的. 先让大家感受一下web.py 的简单而强大: import web ur ...

  2. mybatis实现分页

    实现分页实质上就是截取查询结果,还是先贴代码,再来分析 下面是mapper.xml里面的配置 <select id="queryRoleByPage" resultMap=& ...

  3. CentOS全自动一键安装PHP,MySQL,phpmyadmin与Nginx

    运行install_nginx.sh即可 1,需要修改install_nginx.sh中的相应路径: #存放源代码和本脚本的目录 compile_dir=/root/nginx_compile,需要修 ...

  4. 高并发分布式系统如何做到唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  5. FOJ 1402(dp推规律)

    推规律吧 /** 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  6. Java Something

    Java静态代码检查工具 FindBugs FindBugs is a defect detection tool for Java that uses static analysis to look ...

  7. Java 面试题 自己写的答案

    基本概念 操作系统中 heap 和 stack 的区别 栈(stack)与堆(heap)都是Java用来在内存中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 在函 ...

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.4——自定义代码集合

    问题: 你想要在项目中使用非标准的代码目录. 解决方案: 在gradle的build配置里面使用sourceSets属性. 讨论: Android分发的samples里面使用多个代码目录,使得通用的文 ...

  9. iOS-layoutSubvies和drawRect何时调用

  10. C语言函数重入

    C语言函数重入 可重入函数:可以被中断的函数,即这个函数执行时,可以中断其执行,可以由一个或多个任务并发使用,而不比担心数据错误. 不可重入函数(不安全函数) 不能运行在多任务环境下,除非能保证互斥( ...