3 回答

TA貢獻1772條經驗 獲得超8個贊
并不是說你現在就可以在生產中使用泛型(截至 2020 年 10 月 2 日),但是對于對即將推出的 go 泛型功能感興趣的人,使用最新的go設計草案,你可以編寫一個泛型函數,reverse
如下所示
package main
import (
? ? "fmt"
)
func reverse[T any](s []T) []T {
? ? for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
? ? ? ? s[i], s[j] = s[j], s[i]
? ? }
? ? return s
}
func main() {
? ? s := []int{1, 2, 3, 4, 5}
? ? s = reverse(s)
? ? fmt.Println(s)
}
輸出:
[5 4 3 2 1]

TA貢獻1783條經驗 獲得超4個贊
在泛型出現(很可能被稱為契約)之前,反射和接口是實現這種泛化的唯一工具。
您可以定義reverse()
取值interface{}
并使用reflect
包對其進行索引并交換元素。這通常很慢,并且難以閱讀/維護。
接口提供了一種更好的方法,但要求您為不同類型編寫方法??匆幌逻@個sort
包,特別是sort.Sort()
函數:
func?Sort(data?Interface)
哪里sort.Interface
是:
type Interface interface {
? ? ? ? // Len is the number of elements in the collection.
? ? ? ? Len() int
? ? ? ? // Less reports whether the element with
? ? ? ? // index i should sort before the element with index j.
? ? ? ? Less(i, j int) bool
? ? ? ? // Swap swaps the elements with indexes i and j.
? ? ? ? Swap(i, j int)
}
sort.Sort()能夠對實現 的任何切片進行排序sort.Interface,任何具有排序算法完成其工作所需的方法的切片。這種方法的好處是,您也可以對其他數據結構進行排序,而不僅僅是切片(例如鏈接列表或數組),但通常使用切片。

TA貢獻1831條經驗 獲得超4個贊
耐心!根據向該語言添加類型參數的最新提案草案,您將能夠reverse在 Go 的未來版本中編寫這樣的通用函數:
func reverse[T any](s []T) []T {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}
func main() {
s := []int{1, 2, 3, 4, 5}
s = reverse(s)
fmt.Println(s)
}
(游樂場)
出于性能原因,您可能希望就地反轉切片:
package main
import "fmt"
func reverse[T any](s []T) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
func main() {
s := []int{1, 2, 3, 4, 5}
reverse(s)
fmt.Println(s)
}
(游樂場)
- 3 回答
- 0 關注
- 221 瀏覽
添加回答
舉報