我正在嘗試從多維陣列創建多維切片,并且發生了一些奇怪的事情(至少對我而言)。我創建了一個多維陣列ma并從中制作了三個切片s1, s2, s3。下面的代碼顯示了這一點:
package main
import (
"fmt"
)
func main() {
var ma [4][3]int32 = [4][3]int32{
{10, 20, 30},
{50, 60, 70},
{80, 90, 100},
{110, 120, 130},
}
var s1 [][3]int32 = ma[:] // expected
var s2 [][3]int32 = ma[:][:] // ????
var s3 [][]int32 = ma[0:2][0:2] // ????
}
var s1 [][3]int32 = ma[:]行為符合預期。ma[:]創建一個 [3]int32 陣列的切片,因此我們有一個底層陣列,其中每個元素都是 [3]int32 陣列型別。完全符合我的預期行為。
定義 s1 和 s2 時會出現問題。它的行為不像我預期的那樣。var s2 [][3]int32 = ma[:][:]給出相同的結果var s1 [][3]int32 = ma[:]。我希望它能制作一片切片,而不是一片陣列。這怎么可能?兩者怎么會給出相同的結果呢?
此外,我還希望var s3 [][]int32 = ma[0:2][0:2]創建一片切片。相反,它給出了錯誤“不能在變數宣告編譯器中使用 ma[0:2][0:2]([][3]int32 型別的值)作為 [][]int32 值”。所以不知何故,ma[0:2][0:2]它給出了型別[][3]int32,而不是[][]int32。如何?
我希望我已經解釋了我不清楚的地方。
uj5u.com熱心網友回復:
運算式ma[:][:]決議為(ma[:])[:]. 該運算式的計算結果為一個切片運算式,該切片運算式基于 上的切片運算式的結果ma。外部切片運算式是一個 noop。
Go 沒有多維切片運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535746.html
標籤:去
