golang学习

前端之家收集整理的这篇文章主要介绍了golang学习前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

数组的值拷贝与地址传递

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-包

猜你在找的Go相关文章