zoukankan      html  css  js  c++  java
  • 菜鸟系列Golang学习 — 数组

    有兴趣的关注IT程序员客栈哦

    数组简介

    数组是我们开发者经常使用的数据结构,本节将针对Golang源码介绍数组。首先在我们定义数组时,数组类型、长度都已经确定了。而底层计算机则是为数组分配一块连续的内存来保存数组元素。我们可以快速的通过数组下标索引访问数组元素。一维数组如下图所示:

    在Golang中,我们定义数组:

    var array [10]int
    

    接下来,将结合源码介绍Golang数组。

    1. 数组初始化

    数组在创建时可以直接初始化

    var array = [4]int{1,2,3,4} // 显式指定长度
    var array = [...]int{1,2,3,4} // 需要在代码编译期间,由源代码确定
    

    这两种方式是最后的结果是相同的,第二种方式会由编译器编译代码时转换成上一种方式。
    第一种方式会直接调用下列代码创建数组

    // NewArray returns a new fixed-length array Type.
    func NewArray(elem *Type, bound int64) *Type {
    	if bound < 0 {
    		Fatalf("NewArray: invalid bound %v", bound)
    	}
    	t := New(TARRAY)
    	t.Extra = &Array{Elem: elem, Bound: bound}
    	t.SetNotInHeap(elem.NotInHeap())
    	return t
    }
    

    其中,Type代表数组元素类型,bound代表数组长度。并且数组的位置是在堆或者栈也确定了。

    而第二种方式则会调用下列代码进行创建

    // NewDDDArray returns a new [...]T array Type.
    func NewDDDArray(elem *Type) *Type {
    	t := New(TARRAY)
    	t.Extra = &Array{Elem: elem, Bound: -1}
    	t.SetNotInHeap(elem.NotInHeap())
    	return t
    }
    

    其中,-1只是一个占位符。具体数组长度是在类型检查阶段通过遍历数组元素进行确定的。

    2. 数组的访问

    数组是一段连续的内存空间,通过下标我们就可以快速访问,如果访问越界,会报错。在Golang中,越界错误会在编译期间就会通过类型检查被发现。

    case OINDEX:
    		case TSTRING, TARRAY, TSLICE:
    			...
    			if n.Right.Type != nil && !n.Right.Type.IsInteger() {
    				yyerror("non-integer %s index %v", why, n.Right)
    				break
    			}
    
    			if !n.Bounded() && Isconst(n.Right, CTINT) {
    				x := n.Right.Int64()
    				if x < 0 {
    					yyerror("invalid %s index %v (index must be non-negative)", why, n.Right)
    				} else if t.IsArray() && x >= t.NumElem() {
    					yyerror("invalid array index %v (out of bounds for %d-element array)", n.Right, t.NumElem())
    				...
    			}
    
    

    如果访问越界就会直接报错。

    1. 访问数组的索引是非整数时会直接报错
    2. 访问数组的索引是负数时会直接报错
    3. 访问数组的索引越界时会直接报错

    这些错误在我们开发过程中使用常量访问数组就会直接报错。

    如果你觉得写的不错,请移步www.itkezhan.top或者关注公众号IT程序员客栈
  • 相关阅读:
    Asp.Net生成二维码(中间加logo)
    简单的图片上传
    C#读取路径
    Asp.Net读取配置文件
    C#监听服务
    jQuery 遍历--siblings() 方法、each() 方法
    Window 6大内置对象
    MySQL中几个重要的参数
    DNS构建实战(下篇)
    DNS构建实战(上篇)
  • 原文地址:https://www.cnblogs.com/i-dandan/p/12431211.html
Copyright © 2011-2022 走看看