슬라이스 슬라이스

4194 단어
많은 응용 장면 에서 배열 은 우리 의 수 요 를 만족 시 킬 수 없다.초기 에 배열 을 정의 할 때 우 리 는 얼마나 큰 배열 이 필요 한 지 모 르 기 때문에 우 리 는 '동적 배열' 이 필요 하 다.Go 에서 이런 데이터 구 조 는 sliceslice 진정한 의미 의 동적 배열 이 아니 라 인용 유형 이다.slice 항상 한 밑바닥 array 을 가리 키 고 slice 의 성명 도 array 처럼 길이 가 필요 하지 않 을 수 있다.
//    array  ,      
var fslice []int

다음 에 우 리 는 slice 하 나 를 설명 하고 데 이 터 를 초기 화 할 수 있 습 니 다. 다음 과 같 습 니 다.
slice := []byte {'a', 'b', 'c', 'd'}
slice 한 배열 이나 이미 존재 하 는 slice 에서 다시 성명 할 수 있다.slice array[i:j] 를 통 해 얻 을 수 있 습 니 다. 그 중에서 i 은 배열 의 시작 위치 이 고 j 는 끝 위치 이지 만 포함 되 지 않 습 니 다 array[j]. 그 길 이 는 j-i 입 니 다.
//       10        byte   
var ar = [10]byte {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}

//       byte slice
var a, b []byte

// a      3     ,         ,
a = ar[2:5]
//  a     : ar[2]、ar[3] ar[4]

// b   ar    slice
b = ar[3:5]
// b    :ar[3] ar[4]

주의 slice 와 배열 이 성명 할 때의 차이 점: 배열 을 성명 할 때 괄호 안에 배열 의 길이 나 사용 ... 을 자동 으로 계산 하고 성명 slice 을 설명 할 때 괄호 안에 문자 가 없습니다.
그들의 데이터 구 조 는 다음 과 같다.
그림 2.3 slice 와 array 의 대응 관계 도
slice 는 간단 한 조작 이 있 습 니 다.
  • slice 의 기본 시작 위 치 는 0 이 고 ar[:n] 등가 ar[0:n]
  • 이다.
  • slice 의 두 번 째 서열 은 기본적으로 배열 의 길이 이 고 ar[n:] 등가 ar[n:len(ar)]
  • 한 배열 에서 직접 얻 으 면 slice 이렇게 할 수 있다 ar[:]. 기본 적 인 첫 번 째 서열 은 0 이 고 두 번 째 는 배열 의 길이 이 며 등가 ar[0:len(ar)]
  • 이기 때문이다.
    아래 의 이 예 는 slice 에 관 한 더 많은 조작 을 보 여 주 었 다.
    //       
    var array = [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}
    //     slice
    var aSlice, bSlice []byte
    
    //         
    aSlice = array[:3] //    aSlice = array[0:3] aSlice    : a,b,c
    aSlice = array[5:] //    aSlice = array[5:10] aSlice    : f,g,h,i,j
    aSlice = array[:]  //    aSlice = array[0:10]   aSlice        
    
    //  slice   slice
    aSlice = array[3:7]  // aSlice    : d,e,f,g,len=4,cap=7
    bSlice = aSlice[1:3] // bSlice   aSlice[1], aSlice[2]      : e,f
    bSlice = aSlice[:3]  // bSlice    aSlice[0], aSlice[1], aSlice[2]      : d,e,f
    bSlice = aSlice[0:5] //  slice slice   cap     ,  bSlice  :d,e,f,g,h
    bSlice = aSlice[:]   // bSlice    aSlice   : d,e,f,g
    
    slice 은 인용 유형 이기 때문에 그 중의 요소 의 값 을 바 꿀 때 다른 모든 인용 은 이 값 을 바 꿉 니 다. 예 를 들 어 위의 aSlicebSlice, aSlice 중의 요소 의 값 을 바 꾸 면 bSlice 대응 하 는 값 도 바 뀝 니 다.
    개념 적 으로 볼 때 slice 는 하나의 구조 체 와 같 고 이 구조 체 는 세 가지 요 소 를 포함한다.
  • 하나의 지침 은 배열 에서 slice 지정 한 시작 위치
  • 를 가리킨다.
  • 길이, 즉 slice 길이
  • 최대 길이, 즉 slice 시작 위치 에서 배열 의 마지막 위치 까지 의 길이
    Array_a := [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}
    Slice_a := Array_a[2:5]
    
  • 위의 코드 의 진정한 저장 구 조 는 아래 그림 과 같다.
    그림 2.4 slice 대응 배열 의 정보slice 에 몇 가지 유용 한 내장 함수 가 있 습 니 다.
  • len  가 져 오기 slice 길이
  • cap  가 져 오기 slice 의 최대 용량
  • append  slice 에 하나 이상 의 요 소 를 추가 한 후 slice 와 같은 유형의 slice
  • 을 되 돌려 줍 니 다.
  • copy  함수 copy 는 원본 slicesrc 에서 원 소 를 대상 dst 으로 복사 하고 복 제 된 원소 의 개수
  • 를 되 돌려 줍 니 다.
    주: append 함 수 는 slice 인 용 된 그룹의 내용 을 바 꾸 어 같은 그룹의 다른 slice 을 인용 하 는 데 영향 을 줍 니 다.그러나 slice 에 남 은 공간 (즉 (cap-len) == 0 이 없 을 때 새로운 배열 공간 을 동적 으로 분배 합 니 다.되 돌아 오 는 slice 배열 지침 은 이 공간 을 가리 키 고 원래 배열 의 내용 은 변 하지 않 습 니 다.이 배열 을 인용 한 다른 slice 은 영향 을 받 지 않 습 니 다.

    좋은 웹페이지 즐겨찾기