Go 引入了新的令牌~。
~T 表示具有基础类型 T 的所有类型的集合
不过我看不懂,请高人帮忙解释一下。
下面是一个例子。
type Ordered interface {
Integer | Float | ~string
}
Run Code Online (Sandbox Code Playgroud) 请看下面我的地图
var romanNumeralDict map[int]string = map[int]string{
1000: "M",
900 : "CM",
500 : "D",
400 : "CD",
100 : "C",
90 : "XC",
50 : "L",
40 : "XL",
10 : "X",
9 : "IX",
5 : "V",
4 : "IV",
1 : "I",
}
Run Code Online (Sandbox Code Playgroud)
我希望按照键的大小顺序遍历此映射
for k, v := range romanNumeralDict {
fmt.Println("k:", k, "v:", v)
}
Run Code Online (Sandbox Code Playgroud)
然而,这打印出来
k: 1000 v: M
k: 40 v: XL
k: 5 v: V
k: 4 v: IV
k: 900 v: CM
k: …Run Code Online (Sandbox Code Playgroud) 为了使切片附加操作更快,我们需要分配足够的容量.有两种方法可以追加切片,这是代码:
func BenchmarkSliceAppend(b *testing.B) {
a := make([]int, 0, b.N)
for i := 0; i < b.N; i++ {
a = append(a, i)
}
}
func BenchmarkSliceSet(b *testing.B) {
a := make([]int, b.N)
for i := 0; i < b.N; i++ {
a[i] = i
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op
BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
a[i] = i比a = append(a, i)我快,我想知道为什么?
我有一个命名函数Keys()来获取地图的所有键,这里是代码:
func main() {
m2 := map[int]interface{}{
2:"string",
3:"int",
}
fmt.Println(Keys(m2))
}
func Keys(m map[interface{}]interface{}) (keys []interface{}) {
for k := range m {
keys = append(keys, k)
}
return keys
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了
cannot use m2 (type map[int]interface {}) as type map[interface {}]interface {} in argument to Keys
Run Code Online (Sandbox Code Playgroud)
Go支持泛型,我该如何修复代码?
我感兴趣地阅读了一个关于如何在 Go 中创建映射键切片(使用范围循环)的问题,但是如何编写一个函数来为任何类型的映射执行此操作?映射值类型是一个特别麻烦的问题,因为它甚至不会影响结果切片的类型。
\n例如,我可以编写一个函数,将 map[int]T (其中 T 是任何类型)作为参数并返回 map\xe2\x80\x99s 键的 []int (整数切片)吗?如果\xe2\x80\x99s可能的话,是否可以使函数在map[T1]T2(其中T1和T2是任何类型)上运行并返回[]T1切片?也就是说,我该如何替换下面代码中的问号?我\xe2\x80\x99m猜测我需要一个接口,但我\xe2\x80\x99m对这些接口有点初学者。
\n func keys(m map[?]?) []? {\n var s []?\n k := range m {\n s = append(s, k)\n }\n return s\n }\nRun Code Online (Sandbox Code Playgroud)\n