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

Suraj Joshi 2023년1월30일
  1. 슬라이스 선언
  2. 슬라이스의 연결
  3. Go append()함수의 작동
Go에서 두 절편을 직렬로 연결합니다

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에는 새로운 요소를 추가 할 수있는 충분한 용량이 있으므로 기존 슬라이스에 요소가 추가됩니다.

작가: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

관련 문장 - Go Slice