go语言之数组和切片的一些用法比较

在学习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

}

你可能感兴趣的:(go语言之数组和切片的一些用法比较)