当前位置:网站首页>The usage of slice and the difference between slice and array

The usage of slice and the difference between slice and array

2022-04-23 19:21:00 Handsome that handsome

slice yes go A linguistic feature of , It's kind of like cpp Of vector, Variable length , Can expand space . Today I read it in detail , Make a summary .
slice It's essentially an interval , The prototype is []T, The general implementation is as follows :

type slice struct {
    
    first *T
    len int
    cap int
}

What you can see is a pointer to an array , So it's changing slice Will change the value of the array .
The usage difference between and array is not too big .

  1. Array based creation :
var myArrary [3]int = [3]int{
    1,2,3}
var mySlice []int = myArray[:2] //[first:last] The way , Make up when you are short 0
  1. Create directly :
mySlice = make([]int, 5)// Created a 5 The initial value is 0 The section of 
mySlice = make([]int, 5, 10)// Created a 5, Capacity of 10 The section of 
  1. function :
    len() Returns the number of elements
    cap() Returns the size of the container
    append() New elements
mySlice = append(mySlice, 1, 2, 3) // The parameter type of the latter is actually an indefinite parameter 
mySlice2 = []int{
    7, 8, 9}
mySlice = append(mySlice, mySlice2...)  Join in ... It means that after breaking up, it is passed into 
  1. copy() Deep copy slice
slice1 := []int{
    1, 2, 3, 4, 5}
slice2 := []int{
    1, 2, 3}
copy(slice2, slice1)//copy slice Before 3 Elements to slice2
slice2 = slice1 // Will copy a reference to slice2
  1. Different from array
func arrayModify(array [5]int) {
    
    newArray := array
    newArray[0] = 88
}
func sliceModify(slice []int) {
    
    newSlice := slice
    newSlice[0] = 88
}
func main() {
    
    array := [5]int{
    1, 2, 3, 4, 5}
    slice := []int{
    1, 2, 3, 4, 5}
    arrayModify(array)
    sliceModify(slice)
    fmt.Println(array)
    fmt.Println(slice)
}
// [1 2 3 4 5]
// [88 2 3 4 5]

What you can see is that the array passes values , Does not change the value of the element , This and c/cpp Different , And though slice Value semantics , But it's itself a pointer type , So it changes the value , But it doesn't mean slice The reference , This needs attention . The problems caused by value semantics will be discussed in detail later .

版权声明
本文为[Handsome that handsome]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204210557451036.html