zoukankan      html  css  js  c++  java
  • go语言笔记——数组长度不可变,但是元素值是可变的!!!

    数组声明的格式是:

    var identifier [len]type

    例如:

    var arr1 [5]int

    在内存中的结构是:

    对索引项为 i 的数组元素赋值可以这么操作:arr[i] = value,所以数组是 可变的。

    由于索引的存在,遍历数组的方法自然就是使用 for 结构:

    IDIOM:

    for i:=0; i < len(arr1); i++{
    	arr1[i] = ...
    }

    也可以使用 for-range 的生成方式:

    IDIOM:

    for i,_:= range arr1 {
    ...
    }

    在这里i也是数组的索引。当然这两种 for 结构对于切片(slices)(参考 第 7 章)来说也同样适用。

    问题 7.1 下面代码段的输出是什么?

    a := [...]string{"a", "b", "c", "d"}
    for i := range a {
    	fmt.Println("Array item", i, "is", a[i])
    }

    Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针),所以可以通过 new() 来创建: var arr1 = new([5]int)

    那么这种方式和 var arr2 [5]int 的区别是什么呢?arr1 的类型是 *[5]int,而 arr2的类型是 [5]int

    这样的结果就是当把一个数组赋值给另一个时,需要在做一次数组内存的拷贝操作。例如:

    arr2 := *arr1
    arr2[2] = 100

    这样两个数组就有了不同的值,在赋值后修改 arr2 不会对 arr1 生效。

    所以在函数中数组作为参数传入时,如 func1(arr2),会产生一次数组拷贝,func1 方法不会修改原始的数组 arr2。

    如果你想修改原数组,那么 arr2 必须通过&操作符以引用方式传过来,例如 func1(&arr2),下面是一个例子

    示例 7.2 pointer_array.go:

    package main
    import "fmt"
    func f(a [3]int) { fmt.Println(a) }
    func fp(a *[3]int) { fmt.Println(a) }
    
    func main() {
    	var ar [3]int
    	f(ar) 	// passes a copy of ar
    	fp(&ar) // passes a pointer to ar
    }

    输出结果:

    [0 0 0]
    &[0 0 0]

    另一种方法就是生成数组切片并将其传递给函数(详见第 7.1.4 节)。

    摘自:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.1.md

  • 相关阅读:
    springboot应用docker部署调用phantomjs出现permission denied修复方法
    vue某单元格设置背景色
    vue编辑当行数据,弹窗赋值
    vue使用element-ui的el-input监听不了键盘事件解决
    js获取当前域名
    Jedis Redis 模糊匹配 取得 key 列表
    电脑启机时出windowssystem32driversootsafe64.sys
    Vue子组件调用父组件的方法
    Docker 连接mongodb
    Unsatisfied dependency expressed through field 'mongoTemplate'
  • 原文地址:https://www.cnblogs.com/bonelee/p/6861977.html
Copyright © 2011-2022 走看看