golang 에서 Array 와 Slice

1912 단어
golang 에는 배열 과 Slice 두 가지 데이터 구조 가 있 는데 Slice 는 배열 의 실현 을 바탕 으로 길이 가 동태 적 으로 고정 되 지 않 은 데이터 구조 이 고 본질 적 으로 배열 글자 서열 에 대한 인용 으로 배열 에 대한 경량급 접근 을 제공 합 니 다.그러면 go 의 함수 에서 배열 이나 Slice 를 형 삼 으로 할 때 약간의 차이 가 존재 합 니 다.
우선, golang 에 서 는 이 며, 전 달 된 매개 변수 가 배열 일 때 암시 적 으로 배열 을 인용 이나 포인터 로 전송 하지 않 고 사본 에 전송 합 니 다. 데 이 터 를 경량급 으로 전달 하려 면 이 럴 때 slice 를 사용 해 야 합 니 다.
간단 한 예 를 통 해 이 메커니즘 을 검증 할 수 있다.
package main

import "fmt"

func main()  {
    array := [4]int{1, 2, 3, 4}
    fmt.Printf("  array  :%p
", &array) printArray(array) printSlice(array[0:4]) } func printArray(array [4]int) { fmt.Printf(" array :%p
", &array) for _, e := range array { fmt.Print(e) } fmt.Println() } func printSlice(array []int) { fmt.Printf(" slice :%p
", &array) for _, e := range array { fmt.Print(e) } fmt.Println() }

실행 결 과 는 다음 과 같 습 니 다.
  array  :0xc0000480a0
  array  :0xc0000480e0
1234
  slice  :0xc000044420
1234

실행 결과 에 따 르 면 형 삼 이 배열 이 라면 한 배열 의 복사 본 을 전달 하 는 것 과 같다. 형 삼 과 실 삼 의 주 소 는 모두 같 고 형 삼 이 slice 라면 복사 가 아니 라 인용 으로 전달 된다.
또한 형 삼 이 배열 이 라면 Slice 변 수 는 들 어 올 수 없고 반대로 도 마찬가지 입 니 다.
또한 배열 의 몇 가지 정의 방식 도 차이 가 있다.
예 를 들 어 [...]int{1,2,3,4} 이것 은 하나의 배열 로 printArray([...]int{1,2,3})printSlice([...]int{1,2,3}[0:1]) 두 가지 방식 으로 사용 할 수 있 고 []int{} 은 실제 적 으로 하나의 slice 이기 때문에 printSlice([]int{}) 할 수 있 지만 printArray([]int{}) 하면 컴 파일 러 가 잘못 보고 할 수 있다.따라서 배열 을 정의 할 때 길 이 를 지정 하거나 [...]int{1,2,3} 자동 으로 길 이 를 초기 화 하 는 경우 배열 로 돌아 가 고 길 이 를 지정 하지 않 으 면 slice 로 돌아 갑 니 다.
결론: 복사 본 을 전달 하려 면 배열 을 형 삼 으로 하고 인용 을 전달 하려 면 slice 를 형 삼 으로 한다.배열 을 정의 하려 면 길 이 를 지정 해 야 합 니 다. slice 는 길 이 를 지정 할 수 없습니다 (또는 make 정 의 를 사용 합 니 다).

좋은 웹페이지 즐겨찾기