3 回答

TA貢獻1784條經(jīng)驗 獲得超2個贊
解決代碼問題
如上所述,切片與數(shù)組具有不同的類型,因此您不能在需要[N]T
某些類型的地方N
使用某些類型的東西。T
[]T
sort.Ints
就地對整數(shù)切片進行排序——它具有類型簽名func Ints(a []int)
。您的調(diào)用在 indexsort.Ints(x[i])
索引數(shù)組?,這將返回一個 type 的數(shù)組。這與 sort 函數(shù)不兼容,會導(dǎo)致您觀察到的編譯時錯誤。x
i
[3]int
要從數(shù)組中獲取切片,可以使用切片表達式。這樣的表達式允許使用數(shù)組、切片和一些其他類型來構(gòu)造新的切片。
切片表達式以以下形式給出,a[low : high]
其中low
和high
是可選的整數(shù),提供到支持數(shù)組或切片的索引,這些索引指定要在新切片中返回的范圍。上面的語言規(guī)范鏈接有更多詳細信息,我建議您閱讀;可以說a[:]
一些數(shù)組或切片的最簡單切片表達式a
是語法糖來表示a[0:len(a)-1]
,即將數(shù)組/切片轉(zhuǎn)換為相同長度的切片。
[]int
使用這個技巧,通過切片從多維數(shù)組中獲取類型的切片x[i][:]
:
x[i]
[3]int
像以前一樣返回類型為 的數(shù)組對返回的數(shù)組進行切片會返回類型為 的切片
[]int
,該切片與 兼容sort.Ints
。
sort.Ints
不返回值,切片不可比較
即使您用代碼解決了這些問題,以下行仍然存在兩個問題:
t?:=?sort.Ints(x[i])?==?[]int{1,?2,?3}
sort.Ints
就地排序;它不返回值,因此相等性測試沒有意義。sort.Ints
對不可比較的切片進行操作。不可能調(diào)用A == B
where either?A
or?B
is a slice,除非 either?A
orB
是特殊標識符nil
。這是語言規(guī)范中涵蓋的一個微妙點。(另外:閱讀那一頁,你會注意到數(shù)組是可比較的。)
由于您無法使用相等運算符直接比較切片==
,因此驗證切片的逐元素相等性需要:
切片具有相同的長度(不同的長度意味著一個切片比另一個具有更多的元素)
一個切片的每個索引處的元素與其他切片相同。
(我忽略了一個切片可能與另一個切片具有不同容量的事實,因為我們只關(guān)心元素方面的相等性。)
這可以通過遍歷其中一個切片并驗證每個索引處的元素對應(yīng)于另一個切片中的相同索引來驗證。此示例代碼提供了一個示例:
package main
import (
? ? "fmt"
)
func CheckEquality(a, b []int) bool {
? ? // Slices of dissimilar length are not equal
? ? if len(a) != len(b) {
? ? ? ? return false
? ? }
? ? for i, el := range a {
? ? ? ? if b[i] != el {
? ? ? ? ? ? return false
? ? ? ? }
? ? }
? ? return true
}
func main() {
? ? var mySlice = []int{1, 2, 3, 4, 5}
? ? var mySlice2 = []int{1, 2, 3, 4, 5}? ?// same as mySlice
? ? var otherSlice = []int{5, 6, 7, 8, 9} // dissimilar slice
? ? var longSlice = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
? ? fmt.Println(CheckEquality(mySlice, mySlice2))? ?// Expect true
? ? fmt.Println(CheckEquality(mySlice, otherSlice)) // Expect false
? ? fmt.Println(CheckEquality(mySlice, longSlice))? // Expect false
}

TA貢獻1842條經(jīng)驗 獲得超13個贊
您必須先使用[:]
運算符對數(shù)組進行切片,然后才能將其與sort
包一起使用。
此外,您可以檢查切片的排序是否比排序更有效,使用sort.IntsAreSorted([]int)
, 就像這樣。
var allTrue bool = true
for i := range x {
? ? if !sort.IntsAreSorted(x[i][:]) {
? ? ? ? allTrue = false
? ? ? ? break
? ? }
}

TA貢獻1827條經(jīng)驗 獲得超8個贊
您可以使用運算符從數(shù)組中獲取切片[:],例如:
arr := [3]int{1, 2, 3}
slc := arr[:] // []int{1, 2, 3}, backed by arr
因此,您可以使用以下sort.Ints(...)
功能:
sort.Ints(x[0][:])
sort.Ints(x[1][:])
// Now both elements of "x" are sorted.
- 3 回答
- 0 關(guān)注
- 182 瀏覽
添加回答
舉報