亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

從數組/切片中獲取元素索引或從 Go 中的映射獲取值的鍵?

從數組/切片中獲取元素索引或從 Go 中的映射獲取值的鍵?

Go
慕工程0101907 2021-11-01 10:58:38
我有一個枚舉的字符串列表(它們是常量,例如國家列表),我希望在提供枚舉的 int 值時能夠獲取字符串,反之亦然能夠獲取枚舉的 int 值提供字符串時。這是為了在數據庫事務的兩者之間進行轉換。var MyData = [...]string {  "string1", // index 0  "string2", // index 1  "string3", // index 2  }對于像 python 這樣的語言來說,這很容易,只需執行 MyData[1] 之類的操作即可獲得 "string2" 和 MyData.index("string2") 以獲得 1。一些可能的解決方案是編寫我自己的函數以通過迭代數組/切片來獲取索引對數組/切片進行排序并使用搜索函數返回索引(盡管這不允許未排序的序列,這是我更喜歡的)維護一個映射和一個彼此鏡像的數組,這很容易出錯。說到地圖,可以訪問特定值的鍵嗎?然后我可以簡單地擁有一個如下所示的地圖,并且能夠在提供 int 值時獲取字符串鍵。var MyData = map[string]int {  "string1": 0,  "string2": 1,  "string3": 2,}更新:在我接受我的答案之前,我想更徹底地解釋這個問題,我知道這一定是相當普遍的。我基本上有一組常量字符串(例如國家/地區列表),每個字符串都有一個關聯的整數值。在我的數據庫中,我只是存儲整數以節省空間,因為有數百萬個條目。但是當我顯示數據庫中的條目時,我需要顯示字符串值以便用戶可讀。一個簡單的數組就可以做到這一點。但是,我還需要向數據庫添加條目(例如一個新人及其居住的國家/地區),并且在這種情況下需要從以表格形式輸入的國家/地區字符串轉換為該整數值。同樣,這只是一個示例用例,但是目標保持不變。我需要一個可以在字符串值和枚舉的 int 值之間雙向轉換的表。最明顯的事情是維護一個數組(用于 int 到字符串的轉換)和一個映射(用于字符串到 int 的轉換)。我不想手動維護這兩個變量,因為這很容易出錯。所以我下面的解決方案是只維護一個數組,并在程序第一次運行時讓構造函數方法在運行時自動構建映射。這樣做的優點是,當我根據字符串(這是另一個建議的解決方案)獲取整數值時,不需要遍歷整個數組。
查看完整描述

3 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

在這兩種情況下,您都應該使用內置的 range 函數。


for k, v := range MyData {

}



for i, v := range ThisArray {

}



for i, _ := range ThisArrayIndexOnly {

    value := ThisArrayIndexOnly[i]

}

您可以在此range基礎上構建輔助函數或任何您喜歡的功能,但從根本上說,它是可用于訪問該數據的機制。如果你想要一個“indexof”函數,那就是


for i, v := range ArrayPassedIntoFunction {

     if v == ValuePassedIntoFunction {

          return i

     }

}

return -1

為了獲得價值,您當然只需MyArray[i]包括邊界檢查或其他任何內容。請注意,上面的偽代碼的編寫風格表明它是一個數組,但實際上相同的代碼適用于地圖,我通常只使用 var 名稱k而不是i.


查看完整回答
反對 回復 2021-11-01
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

假設你想在數組的數據中獲取單詞的索引


data := [...] {"one","two","three"}

或定長數組


data := [3] {"one","two","three"}

創建函數


func indexOf(word string, data []string) (int) {

    for k, v := range data {

        if word == v {

            return k

        }

    }

    return -1

}

從上面的函數中獲取值,匹配類型,傳遞數組array[:]如下


fmt.Println(indexOf("two", data[:]))


查看完整回答
反對 回復 2021-11-01
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

這是我之前提到的一個解決方案,它適用于靜態切片(這是我的用例)。每次我想要一個值的索引時迭代切片都會增加不必要的延遲,特別是因為我的數據在運行時是靜態的。這只是創建一個結構體,它初始化切片并創建相應的逆映射。然后我將使用 GetKey 和 GetVal 方法通過提供 int 'value' 來獲取字符串 'key',或者通過提供字符串 'key' 來獲取 int 'value'。也許已經有一種方法可以在 Go 中獲取地圖特定值的鍵。


type MyData struct {

    dataslice []string

    datamap map[string]int

}


func NewMyData() *MyData {

    m := new(MyData)

    m.dataslice= []string {

        "string1",

        "string2",

        "string3",

    }

    m.datamap = make(map[string]int)

    for x := range m.dataslice {

        m.datamap[m.dataslice[x]] = x

    }

    return m

}


func (m *MyData) GetKey(x int) string {

    return m.dataslice[x]

}


func (m *MyData) GetVal(x string) int {

    return m.datamap[x]

}


查看完整回答
反對 回復 2021-11-01
  • 3 回答
  • 0 關注
  • 416 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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