关于Golang语言数组索引的有趣现象

在Twitter上看到Dave Cheney提了个pop quiz 勾起了我的好奇心,可以猜下下面这段代码的运行结果。

package main

import "fmt"

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

go run 一下结果就出来了 但是比较有意思的是结果是

[5 4 3 2 1 0]

下面就一步步地分析是什么情况

[number:value] 在go的数组中代表的是在索引未number处的位置上值为value 如果索引值越界了就会重置。

5 _ _ _ _ _ index : 0, value : 5

5 _ _ _ 1 _ index : 4, value : 1

5 _ _ _ 1 0 index : 5, value : 0 因为上一个操作的元素索引为4 ([4:1])所以下一个操作的元素索引自动加1

5 _ 3 _ 1 0 index : 2, value : 3

5 _ 3 2 1 0 index : 3, value : 2 因为上一个操作的元素索引为2 ([2:3])所以下一个操作的元素索引自动加1

5 1 3 2 1 0 index : 1, value : 4

操作数组元素的顺序是按照声明时的顺序,顺序操作的。5 1 0 3 2 4就是按照这个顺序 进行操作的。

所以如果把代码改一下就会报错 比如下面的例子

package main

import "fmt"

func main() {
	a := [...]int{5, 4: 1, 0, 2: 3, 2, 1: 4, 10}
	fmt.Println(a)
}

结果

prog.go:6: duplicate index in array literal: 2
 [process exited with non-zero status]

报错信息是 第二个索引重复了

接着上面的分析

5 1 3 2 1 0 index : 1, value : 4 这时如果继续操作下一个元素根据规则 索引加1

也就是 要对index : 2 的元素进行 value : 10的操作 但是之前我们已经在索引为2时赋值过了 所以就会有异常

duplicate index in array literal: 2

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-04-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据之美

Shell 参数扩展及各类括号在 Shell 编程中的应用

今天看有人总结了 shell 下的参数扩展,但不是很全,恰好以前整理过放在百度空间,但百度空间目前半死不活的情况下对 Google 非常不友好,索性一并转过来方...

2137
来自专栏海天一树

2018 TCO Algorithm-Round 1B 600-points题解报告

Consider the set of integers between 1 and n, inclusive, and two positive intege...

863
来自专栏张善友的专栏

深入浅出事件流处理NEsper(二)

NEsper使用的事件类型来描述事件的类型信息。你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型。 EPL中的cr...

19910
来自专栏编程

这或许是对小白最友好的python入门了吧——2,变量和字符串

长期以来,编程界都认为刚接触一门新语言时,如果首先使用它来编写一个在屏幕上显示消息 “Hello world!” 的程序,将给你带来好运。 在Python中我...

2076
来自专栏青玉伏案

iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements

  在前面的博客中已经介绍了如何连接SQLite数据库,并且简单的查询和遍历结果集。在前面用到了sqlite3_stmt *stmt,也就是预编译后的SQL语句...

1886
来自专栏闵开慧

pig操作与注意事项

grunt> A = load 'hdfs://192.168.0.118:9000/user/hadoop/data.txt' as (name:charar...

2763
来自专栏博客园

Core官方DI解析(4)--CallSiteRuntimeResolver

​ CallSiteRuntimeResolver类型是一个创建或获取服务实例的类型,这个类型继承了CallSiteVisitor<TArgument, TRe...

961
来自专栏水击三千

ARCGIS接口详细说明

ArcGIS接口详细说明 目录 ArcGIS接口详细说明... 1 1.      IField接口(esriGeoDatabase)... 2 2.     ...

4136
来自专栏守候书阁

实例感受-es6的常用语法和优越性

前几天,用es6的语法重写了我的一个代码库,说是重写,其实改动的并不多,工作量不大。在重写完了的时候,就个人总结了一下es6常用的一些常用的语法和比es5优越的...

823
来自专栏王硕

原 PostgreSQL的系统函数分析记录

1313

扫码关注云+社区

领取腾讯云代金券