main.go演示效果如下:
root@XIAOMO:~/gopro# ./main [1 2 3] [1 2 3 0 0] [0 0 0 0 0 0 0 0 0 0 3 0 0 0 0] [4 5 6] [1 2 0 0 0 7]main.go示例
package main func accessElem() { array := [3]int{1, 3, 9} // 通过下标访问 for i:=0; i < len(array); i++ { fmt.Println(i, array[i]) } // 迭代方式访问 for i, v := range array { fmt.Println(i, v) } // 使用new创建数组,零值填充, 返回数组指针 p := new([5]int) fmt.Println(*p) } func main(){ accessElem() }示例演示效果:
root@XIAOMO:~/gopro# ./main 0 1 1 3 2 9 0 1 1 3 2 9 [0 0 0 0 0]和C++类似, 函数参数传递中可以传值或传指针:
// 传值, 每次调用foo1, 系统将分配16字节内存在栈上 // 函数运行结束时, 会弹栈并释放16字节内存 func foo1(arr [16]int) { // ... } var a [16]int foo1(a) // 传指针, 每次调用foo2, 系统将只分配指针需要的内存空间 func foo2(arr *[16]int){ // ... } var b [16]int foo2(&b)main.go
package main func createSlice() { // 通过array创建slice, 用法神似python arr := [5]int{1,2,3,4,5} sli1 := arr[:3] // 切出前三个元素 sli2 := arr[:4] // 切出前四个元素 sli1[1] = 8 sli2[1] = 9 // 将打印 9 9 9, 可见修改的是同一个元素 println(arr[1], sli1[1], sli2[1]) // 通过make创建slice sli3 := make([]int, 3) sli4 := make([]int, 4, 8) //初始4个元素,预留8个元素的空间 sli5 := []int{1,2,3,4,5} //初始化赋值 fmt.Printf("%v\n", sli3) fmt.Printf("%v\n", sli4) fmt.Printf("%v\n", sli5) } func main(){ createSlice() }由于slice是指向底层数组的指针, 在函数间传递slice是开销很小的。 在64位机器中, slice对象占24个字节, 三个元素分别占8个字节。 作为参数在函数中传递的方式和数组类似。
主要区别:
new可以用来创建各种类型对象, 也即是各类型的空间分配;make用来处理内建类型(slice, channel, map等)的内存分配.