여러 인수를 허용하는 가변 함수로 작업할 때 슬라이스 슬라이스를 처리하는 것이 어려울 수 있습니다. 다음은 슬라이스 조각을 풀면 컴파일러 오류가 발생할 수 있는 구체적인 사례입니다.
다음 가변 함수를 고려하세요.
<code class="go">func unpack(args ...interface{})</code>
인터페이스 조각이 있으면 직접 전달할 수 있습니다. 문제 없이 함수에 추가:
<code class="go">slice := []interface{}{1, 2, 3} unpack(slice) // works unpack(slice...) // also works</code>
그러나 인터페이스 조각이 있는 경우 압축을 푼 버전을 전달하려고 하면 컴파일 오류가 발생합니다.
<code class="go">sliceOfSlices := [][]interface{}{ []interface{}{1, 2}, []interface{}{101, 102}, } unpack(sliceOfSlices) // works unpack(sliceOfSlices...) // compiler error</code>
오류 메시지는 다음과 같습니다.
cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack
이 동작을 이해하려면 Go에서 가변 매개변수에 인수를 전달하기 위한 사양을 자세히 조사해야 합니다.
"마지막 인수가 할당 가능한 경우 슬라이스 유형 []T에 대해 인수 뒤에 ...."가 오면 ...T 매개변수의 값으로 변경되지 않고 전달될 수 있습니다."
이 경우 가변 매개변수는 ...interface{}이며, args([]interface{} 유형)에 대한 SliceOfSlices([][]interface{} 유형)를 직접 할당하는 것은 유효하지 않습니다.
따라서, 압축이 풀린 SliceOfSlices의 내용을 unpack()으로 어떻게 보낼 수 있나요? 해결책은 []interface{} 유형의 새 슬라이스를 생성하고 요소를 복사한 다음 ....
<code class="go">var sliceOfSlices2 []interface{} for _, v := range sliceOfSlices { sliceOfSlices2 = append(sliceOfSlices2, v) } unpack(sliceOfSlices2...)</code>
을 사용하여 전달하는 것입니다. 이 방법을 사용하면 각 내부 슬라이스가 요소로 표시됩니다. ...interface{} 가변 매개변수와 호환됩니다.
위 내용은 Go에서 슬라이스 조각을 Variadic 함수로 압축 해제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!