我在 go 中制作了一段字串。然后,我又做了兩片。第一個是unsorted原始切片,第二個是sorted原始切片。但是,當我使用 package 對第二個切片進行排序時sort,第一個切片也會被排序。我怎樣才能只對第二個進行排序?
og := []string{"go", "python", "java", "C "}
unsorted :=og
sorted := og
sort.Strings(sorted)
fmt.Println("unsorted", unsorted)
fmt.Println("sorted", sorted)
實際輸出:
unsorted [C go java python]
sorted [C go java python]
預期輸出:
unsorted [go python java C ]
sorted [C go java python]
uj5u.com熱心網友回復:
所以切片有時被稱為參考型別。例如,您可以在此處閱讀有關陣列和切片之間差異的更多資訊(我找到的第一頁)。
切片基本上是什么,您可以從runtime包中的源代碼(slice.go 檔案)中看到:
type slice struct {
array unsafe.Pointer
len int
cap int
}
當你分配切片unsorted和sorted變數,你創建這個潛在的副本slice結構。您實際上是將指標復制到由 操作的底層陣列sort.Strings(),因此對切片的兩個參考都將反映這些更改。
您需要做的是將切片復制到新的切片中,以避免在此處看到更改go playground 代碼段的順序。
為了完整起見:
og := []string{"go", "python", "java", "C "}
unsorted := make([]string, len(og)) // create a new slice
copy(unsorted, og) // copy over values
sorted := og // this isn't a required line, you can just sort og
sort.Strings(sorted)
fmt.Printf("%#v\n%#v\n", unsorted, sorted)
您可以將其簡化如下,而不是使用make和呼叫copy:
unsorted := append([]string{}, og...) // append to new slice == copy
uj5u.com熱心網友回復:
當您將一個切片分配給另一個切片時,您會得到一個淺拷貝。它們都將參考相同的底層資料陣列。
如果你想修改一個并保留原來的,你需要復制切片的內容,然后修改它。
package main
import (
"fmt"
"sort"
)
func copySlice(slice []string) []string {
newSlice := make([]string, len(slice))
copy(newSlice, slice)
return newSlice
}
func main() {
og := []string{"go", "python", "java", "C "}
unsorted := copySlice(og)
sorted := copySlice(og)
sort.Strings(sorted)
fmt.Println("unsorted", unsorted)
fmt.Println("sorted", sorted)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324614.html
