加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang学习

发布时间:2020-12-16 18:22:51 所属栏目:大数据 来源:网络整理
导读:数组的值拷贝与地址传递 Go 语言中的数组是一种 值类型 (不像 C/C++ 中是指向首元素的指针),所以可以通过 new() 来创建: var arr1 = new([5]int) 。 那么这种方式和 var arr2 [5]int 的区别是什么呢?arr1 的类型是 *[5]int ,而 arr2的类型是 [5]int 。

数组的值拷贝与地址传递

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.2pointer_array.go:

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

切片

切片也可以用类似数组的方式初始化: var x = []int{2,3,5,7,11} 。这样就创建了一个长度为 5 的数组并且创建了一个相关切片。

如果 s2 是一个 slice,你可以将 s2 向后移动一位s2 = s2[1:],但是末尾没有移动。切片只能向后移动,s2 = s2[-1:]会导致编译错误。切片不能被重新分片以获取数组的前一个元素。

注意绝对不要用指针指向 slice。切片本身已经是一个引用类型,所以它本身就是一个指针!!

7.2.2 将切片传递给函数

如果你有一个函数需要对数组做操作,你可能总是需要把参数声明为切片。当你调用该函数时,把数组分片,创建为一个 切片引用并传递给该函数。这里有一个计算数组元素和的方法:

sum(a []int) int {
    s := 0
    for i 0; i < len(a); i++ {
        s += a[i]
    }
    return s
}

var arr = [5]int{0,1,179)">2,179)">3,179)">4}
    sum(arr[:])
}

7.2.4 new() 和 make() 的区别

https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.2.md#724-new-和-make-的区别

bytes 包 大量连接字符串的时候用

https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.2.md#726-bytes-包

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读