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

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

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

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

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

3 回答

?
catspeake

TA貢獻1111條經(jīng)驗 獲得超0個贊

在這兩種情況下,您都應該使用內(nèi)置的 range 函數(shù)。


for k, v := range MyData {

}



for i, v := range ThisArray {

}



for i, _ := range ThisArrayIndexOnly {

    value := ThisArrayIndexOnly[i]

}

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


for i, v := range ArrayPassedIntoFunction {

     if v == ValuePassedIntoFunction {

          return i

     }

}

return -1

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


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

TA貢獻1995條經(jīng)驗 獲得超2個贊

假設你想在數(shù)組的數(shù)據(jù)中獲取單詞的索引


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

或定長數(shù)組


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

創(chuàng)建函數(shù)


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

    for k, v := range data {

        if word == v {

            return k

        }

    }

    return -1

}

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


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


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

TA貢獻1873條經(jīng)驗 獲得超9個贊

這是我之前提到的一個解決方案,它適用于靜態(tài)切片(這是我的用例)。每次我想要一個值的索引時迭代切片都會增加不必要的延遲,特別是因為我的數(shù)據(jù)在運行時是靜態(tài)的。這只是創(chuàng)建一個結(jié)構(gòu)體,它初始化切片并創(chuàng)建相應的逆映射。然后我將使用 GetKey 和 GetVal 方法通過提供 int 'value' 來獲取字符串 'key',或者通過提供字符串 'key' 來獲取 int 'value'。也許已經(jīng)有一種方法可以在 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 關(guān)注
  • 407 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號