Development Tip

슬라이스 유형

yourdevel 2020. 11. 28. 12:34
반응형

슬라이스 유형


저는 현재 훌륭한 Tour of Go를 통해 작업하고 있습니다. 다음 솔루션으로 연습 중 하나 (# 45)를 완료했습니다.

func Pic(dx, dy int) [][]uint8 {
    pic := make([][]uint8, dy) /* type declaration */
    for i := range pic {
        pic[i] = make([]uint8, dx) /* again the type? */
        for j := range pic[i] {
            pic[i][j] = uint8((i+j)/2)
        }
    }
    return pic
}

유형이 있는 make문을 uint8두 번 사용해야하는 이유를 이해하지 못합니다 (스 니펫의 주석 참조). 중복되는 것처럼 보이지만 다른 방법으로 수행하는 방법을 알 수 없습니다.


Go에서이 작업을 수행하는 다른 방법은 없습니다.

예, 장황하지만 필요하다는 데 동의합니다. 두 번째 make () 문은 첫 번째 문과 완전히 독립적입니다. 컴파일러가에서 유형을 추론 할 수 있어야한다고 주장 할 수 pic[i]있지만이 시점에서는 그렇지 않습니다.

또 다른 요점 : 두 번째 경우에서 유형을 생략하면 make () 문이 어떻게 보일까요? 실제 할당을 수행하고 필요한 len / capacity를 지정할 수 있으려면 make ()가 여전히 필요합니다.

참고로 슬라이스 길이를 혼합했습니다. 운동은 최상위 조각은 길이가 있어야 명시 dy하지, dx당신은 당신의 코드에 넣어.


명확하게하기 위해 괄호를 사용하여 다음 [][]uint8과 같이 다시 작성할 수 있습니다 []([]uint8). a slice of (slices of type uint8).

은 Using 메이크업 유형의 슬라이스를 들어, 내장 기능 T, make(T, n)유형의 슬라이스 반환 T길이 n와 용량을 n.

따라서 make([][]uint8, 2)는와 동일 make([]([]uint8), 2)하며 길이와 용량이 2인 슬라이스 유형의 슬라이스를 반환합니다 uint8. 여기서 유형의 각 슬라이스 uint8는 0 값 ( nil길이와 용량이 0 인 참조)으로 초기화됩니다 .

다차원 슬라이스는 들쭉날쭉하고 다차원 들쭉날쭉 한 배열 과 유사 합니다 .

예를 들면

package main

import "fmt"

func main() {
    ss := make([][]uint8, 2) // ss is []([]uint8)
    fmt.Printf("ss:    %T %v %d\n", ss, ss, len(ss))
    for i, s := range ss { // s is []uint8
        fmt.Printf("ss[%d]: %T %v %d\n", i, s, s, len(s))
    }
}

산출:

ss:    [][]uint8 [[] []] 2
ss[0]: []uint8 [] 0
ss[1]: []uint8 [] 0

참고 URL : https://stackoverflow.com/questions/7703251/slice-of-slices-types

반응형