3 回答

TA貢獻1777條經驗 獲得超3個贊
您應該更改函數以使用您的類型:
func ArrayKeys(elements map[string]int) []string {
i, keys := 0, make([]string, len(elements))
for key, _ := range elements {
keys[i] = key
i++
}
return keys
}
https://play.golang.org/p/n5kZego0ePY
但是為什么要更改簽名呢?
如果 Go 中的函數采用空接口,則所有包含的變量都不再具有類型。但是 Go 是強類型的,所以處理沒有類型的變量是很困難的。如果您提供像您這樣的功能,那么代碼應該真正處理任何類型。為此,您需要使用反射包。如果你有一個錯誤,你錯過了一些東西,當錯誤發(fā)生時,你的程序會崩潰。當您編寫服務器時,它可以運行數月然后停止運行。
如果您ArrayKey為每種類型編寫一個函數,那么情況就會有所不同。編譯器確保你的代碼是健壯的,并且永遠不會在那個時候出現恐慌。如果您想嘗試將該函數與其他類型的地圖一起使用,則代碼將無法編譯。這就是 Go 的工作方式。

TA貢獻1869條經驗 獲得超4個贊
在 Go 中,編寫一個簡單的函數。例如,
package main
import "fmt"
func main() {
items := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
keys := func(m map[string]int) []string {
mk := make([]string, 0, len(m))
for k := range m {
mk = append(mk, k)
}
return mk
}(items)
fmt.Printf("%d %q\n", len(keys), keys)
}
游樂場:https://play.golang.org/p/B0kOxAGbQCZ
輸出:
3 ["three" "one" "two"]
對于排序鍵,
package main
import (
"fmt"
"sort"
)
func main() {
items := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
keys := func(m map[string]int) []string {
mk := make([]string, 0, len(m))
for k := range m {
mk = append(mk, k)
}
sort.Strings(mk)
return mk
}(items)
fmt.Printf("%d %q\n", len(keys), keys)
}
游樂場:https://play.golang.org/p/IQLx7gjGk8j
輸出:
3 ["one" "three" "two"]

TA貢獻1847條經驗 獲得超7個贊
錯誤中明確提到:
不能在 ArrayKeys 的參數中使用項目(類型 map[string]int)作為類型 map[interface {}]interface {}
由于類型不匹配,您會遇到上述錯誤。如果你想在函數中使用任何類型,你可以選擇接口,因為interface{}不等于map[interface{}]interface{}
如果你真的想使用接口,你可以去interface{}包裝來自的數據。maps否則,您應該使用與上述答案中提到的相同類型作為函數的參數。
package main
import (
"fmt"
)
func ArrayKeys(elements interface{}) []interface{} {
i, keys := 0, make([]interface{}, len(elements.(interface{}).(map[string]int)))
for key, _ := range elements.(interface{}).(map[string]int) {
keys[i] = key
i++
}
return keys
}
func main() {
items := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
keys := ArrayKeys(items)
fmt.Println(keys)
}
Go Playground上的工作代碼
- 3 回答
- 0 關注
- 125 瀏覽
添加回答
舉報