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 is a backend software engineer at Matrice.ai.
LinkedIn