在学习go语言的数组和切片时,将一些疑惑的地方记录下来,并做了实践分析
package main
import (
"fmt"
"reflect"
)
func main() {
// 比较两种初始化声明的差异
var arr1 = new([5]int)
var arr2 [5]int
fmt.Println(reflect.TypeOf(arr1))// *[5]int 指针
fmt.Println(reflect.TypeOf(arr2))// [5]int 数组
arr2 = *arr1
fmt.Println(arr1 == &arr2) // false
fmt.Println(*arr1, arr2, *arr1 == arr2) //[0 0 0 0 0] [0 0 0 0 0] true
arr2[1] = 100
fmt.Println(*arr1,arr2, *arr1 == arr2)//修改2不会影响1 [0 0 0 0 0] [0 100 0 0 0] false
// 比较切片和数组
//var s5 []int //切片不需要说明长度,未初始化的时候默认为nil
//var s5 = make([]int,4) // make会初始化切片,所以下面的结果是 [0 0 0 0] [0 0 0 0]
var s6 [4]int //数组需要说明长度
fmt.Println(s5,s6) // [] [0 0 0 0]
s1 := []byte{'p', 'o', 'e', 'm'} //这样定义出来的是切片,切片本身也是指针
s2 := s1[:]
fmt.Println(reflect.TypeOf(s1),reflect.TypeOf(s2)) // []uint8 []uint8
//fmt.Println(s1 == s2) //error: invalid operation: s1 == s2 (slice can only be compared to nil)
fmt.Println(s1,s2,&s1 == &s2) //[112 111 101 109] [112 111 101 109] false
s2[1] = 't'
fmt.Println(s1,s2,&s1 == &s2) //[112 116 101 109] [112 116 101 109] false 这里相当于比较两个指针的内存地址,参考 &s3 == &s4
var s3 = new([4]int) // 这样定义出来的是指针
s4 := s3
fmt.Println(reflect.TypeOf(s3), reflect.TypeOf(s4)) //*[4]int *[4]int
fmt.Println(s3,s4, &s3 == &s4, s3 == s4, *s3 == *s4) // &[0 0 0 0] &[0 0 0 0] false true true
s4[1] = 8
fmt.Println(s3,s4, s3 == s4, *s3 == *s4) // &[0 8 0 0] &[0 8 0 0] true true
}