Go에서 두 절편을 직렬로 연결합니다

  1. 슬라이스 선언
  2. 슬라이스의 연결
  3. Go append()함수의 작동

Go에서 슬라이스는 동일한 데이터 유형의 여러 요소를 저장하는 동적 데이터 구조입니다. 또한 배열을 기준으로 색인을 생성하는 가변 크기 배열로 생각할 수 있지만 크기를 조정할 수 있으므로 크기가 고정되어 있지 않습니다. 슬라이스는 본질적으로 동적이므로append() 함수를 사용하여 둘 이상의 슬라이스를 슬라이스하거나 연결하기 위해 새로운 요소를 추가 할 수 있습니다.

슬라이스 선언

Slice의 선언은 배열의 선언과 유사하지만, 그 규모는 명시되어 있지 않다.

package main

import "fmt"

func main() {
    var Slice1 = []int{1, 2, 3, 4}
    fmt.Printf("Length of Slice: %v\n",len(Slice1))
    fmt.Printf("First Element: %v\n",Slice1[0])
    fmt.Printf("Second Element: %v\n",Slice1[1])
    fmt.Printf("Third Element: %v\n",Slice1[2])
    fmt.Printf("Fourth Element: %v\n",Slice1[3])

}

출력:

Length of Slice: 4
First Element: 1
Second Element: 2
Third Element: 3
Fourth Element: 4

슬라이스의 연결

내장 된append()함수를 사용하여 둘 이상의 슬라이스를 함께 나열하거나 연결하는 요소를 추가합니다. 용량이 충분하면 대상이 새 요소를 수용하도록 슬라이스됩니다. 사용 가능한 용량이 충분하지 않으면 새로운 기본이 할당되고 내용이 복사됩니다. 마지막으로append 함수는 업데이트 된 슬라이스를 반환합니다.

슬라이스 할 단일 요소 추가

package main

import "fmt"

func main() {
    var slice_1 = []int{1, 2}
    slice_2 := append(slice_1, 3)  
    fmt.Printf("slice_1: %v\n", slice_1)
    fmt.Printf("slice_2: %v\n", slice_2)

}

출력:

slice_1: [1 2]
slice_2: [1 2 3]

슬라이스에 여러 요소 추가

package main

import "fmt"

func main() {
    var slice_1 = []int{1, 2}
    slice_2 := append(slice_1, 3)
    slice_3 := append(slice_2, 4,5,6)   
    fmt.Printf("slice_3: %v\n", slice_3)

}

출력:

slice_3: [1 2 3 4 5 6]

두 조각을 연결

package main

import "fmt"

func main() {
    var slice_3 = []int{1, 2, 3, 4, 5, 6}
    var slice_4 = []int{7,8}
    
    slice_5 := append(slice_3,slice_4...) 
    fmt.Printf("slice_4: %v\n", slice_4)
    fmt.Printf("slice_5: %v\n", slice_5)

}

출력:

slice_4: [7 8]
slice_5: [1 2 3 4 5 6 7 8]

이동 중에 두 조각을 연결하는 동안 주목해야 할 중요한 점은append()가 다른 다양한 기능 마찬가지로 vlicedic 함수이므로slice_4 다음에...가 필수적이라는 것입니다. ...를 사용하면 슬라이스에서 함수에 여러 인수를 전달할 수 있습니다. 여기서append 함수는slice_4의 각 요소에 대해 재귀 적으로 호출됩니다.

바이트 슬라이스에 문자열을 추가

var slice []byte = append([]byte("abc "), "def"...)
fmt.Printf("slice: %v\n", slice)

출력:

slice: [97 98 99 32 100 101 102]

여기서 문자는 ASCII 값의 문자를 나타내는 3 바이트를 사용하여 UTF-8로 인코딩됩니다. 슬라이스 바이트는 다음과 같이 문자열로 다시 변환 될 수 있습니다.

slice_str := string(slice)
fmt.Printf("String: %v\n", slice_str)

출력:

Slice: abc def

Go append()함수의 작동

append()내장 함수는 슬라이스를 가져 와서 모든 요소를 ​​입력 슬라이스의 끝에 추가 한 다음 연결된 슬라이스를 반환합니다. 대상 슬라이스의 용량이 충분한 경우 새 추가 요소를 수용 할 수 있도록 슬라이스가 다시 슬라이스됩니다. 그러나 대상에 충분한 용량이 없으면 새 배열이 만들어지고 기존 슬라이스에있는 요소가 새 배열에 복사되고 마지막으로 함수에 의해 새 배열이 반환됩니다.

package main

import "fmt"

func main() {

    slice_1 := []int{0, 1, 2}
    fmt.Println("slice_1 : ", slice_1)
    fmt.Println("Capacity of slice_1: ", cap(slice_1))

    res_1 := append(slice_1, 3)
    fmt.Println("res_1 : ", res_1)
    fmt.Println("Capacity of res_1: ", cap(res_1))

    slice_2 := make([]int, 3, 5)  //Create slice_1 with length 3 and capacity 5
    copy(slice_2, []int{0, 1, 2}) //Copy elements into slice_1
    fmt.Println("slice_2 : ", slice_2)
    fmt.Println("Capacity of slice_2: ", cap(slice_2))

    res_2 := append(slice_2, 3)
    fmt.Println("res_2 : ", res_2)
    fmt.Println("Capacity of res_2: ", cap(res_2))

}

출력:

slice_1 :  [0 1 2]
Capacity of slice_1:  3
res_1 :  [0 1 2 3]
Capacity of res_1:  6
slice_2 :  [0 1 2]
Capacity of slice_2:  5
res_2 :  [0 1 2 3]
Capacity of res_2:  5

여기서slice_1에는 새 요소를 추가 할 수있는 충분한 용량이 없으므로 용량 6의 새 슬라이스가 작성되고 기존 슬라이스의 모든 요소가 새로 작성된 슬라이스로 복사됩니다.

그러나slice_2에는 새로운 요소를 추가 할 수있는 충분한 용량이 있으므로 기존 슬라이스에 요소가 추가됩니다.

관련 문장 - Go Slice

  • Golang의 슬라이스에서 요소를 삭제하는 방법