第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢索任意地圖變量的鍵

檢索任意地圖變量的鍵

Go
瀟湘沐 2023-03-21 17:01:22
我想獲取任意地圖變量的鍵。我發(fā)現了這個函數,它復制了 PHParray_keys行為:https://www.php2golang.com/method/function.array-keys.html。但是下面的代碼:items := map[string]int{    "one":   1,    "two":   2,    "three": 3,}keys := ArrayKeys(items)拋出下一個“編譯時”異常:不能在 ArrayKeys 的參數中使用項目(類型 map[string]int)作為類型 map[interface {}]interface {}我究竟做錯了什么?這是一個例子: https: //play.golang.org/p/0ImqjPJFFiE
查看完整描述

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 的工作方式。


查看完整回答
反對 回復 2023-03-21
?
MMTTMM

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"]


查看完整回答
反對 回復 2023-03-21
?
aluckdog

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上的工作代碼



查看完整回答
反對 回復 2023-03-21
  • 3 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號