golang-101-hacks(13)——Array

羊羽share · · 584 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

注:本文是对golang-101-hacks中文翻译。
在Go语言中,长度值是数组类型的一部分。下面的代码声明了一个数组:

var array [3]int

var slice []int声明的是一个切片类型。因此尽管是元素类型相同但长度不同的数组是不能相互赋值。例如:

package main

import "fmt"

func main() {
    var a1 [2]int
    var a2 [3]int
    a2 = a1
    fmt.Println(a2)
}

The compiler will complain:

cannot use a1 (type [2]int) as type [3]int in assignment
Changing "var a1 [2]int" to "var a1 [3]int" will make it work.
另一个需要注意的点是,下面的代码声明了一个数组,而不是一个切片:

array := [...]int {1, 2, 3} 
You can verify it by the following code:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    array := [...]int {1, 2, 3}
    slice := []int{1, 2, 3}
    fmt.Println(reflect.TypeOf(array), reflect.TypeOf(slice))
}

输出结果如下
The output is:

[3]int []int

此外,在Go语言中,函数参数是值传递,如果使用数组作为函数参数,函数只是对数组副本进行操作。查看如下代码:

package main

import (
    "fmt"
)

func changeArray(array [3]int) {
    for i, _ := range array {
        array[i] = 1
    }
    fmt.Printf("In changeArray function, array address is %p, value is %v\n", &array, array)
}

func main() {
    var array [3]int

    fmt.Printf("Original array address is %p, value is %v\n", &array, array)
    changeArray(array)
    fmt.Printf("Changed array address is %p, value is %v\n", &array, array)
}   

输出结果是:

Original array address is 0xc082008680, value is [0 0 0]
In changeArray function, array address is 0xc082008700, value is [1 1 1]
Changed array address is 0xc082008680, value is [0 0 0]

通过打印日志中发现,changeArray函数中的数组地址与main函数中的数组地址是不一样的,导致原始数组的内容不会被修改。此外需要特别注意的是,如果数组非常大,在参数传递时,对数组进行复制开销会非常大。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:羊羽share

查看原文:golang-101-hacks(13)——Array

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

584 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传