Существуют ли библиотеки go, которые предоставляют возможности ассоциативных массивов?

Это моя реализация BubbleSort :

Option Explicit

Public Function fnVarBubbleSort(ByRef colInput As Collection, Optional bAsc = True) As Collection

    Dim varTemp                 As Variant
    Dim lngCounter              As Long
    Dim lngCounter2             As Long

    For lngCounter = 1 To colInput.Count - 1
        For lngCounter2 = lngCounter + 1 To colInput.Count
            Select Case bAsc
            Case True:
                If colInput(lngCounter) > colInput(lngCounter2) Then
                    varTemp = colInput(lngCounter2)
                    colInput.Remove lngCounter2
                    colInput.Add varTemp, varTemp, lngCounter
                End If

            Case False:
                If colInput(lngCounter) < colInput(lngCounter2) Then
                    varTemp = colInput(lngCounter2)
                    colInput.Remove lngCounter2
                    colInput.Add varTemp, varTemp, lngCounter
                End If
            End Select
        Next lngCounter2
    Next lngCounter

    Set fnVarBubbleSort = colInput

End Function

Public Sub TestMe()

    Dim colCollection   As New Collection
    Dim varElement      As Variant

    colCollection.Add "2342"
    colCollection.Add "vityata"
    colCollection.Add "na"
    colCollection.Add "baba"
    colCollection.Add "ti"
    colCollection.Add "hvarchiloto"
    colCollection.Add "stackoveflow"
    colCollection.Add "beta"
    colCollection.Add "zuzana"
    colCollection.Add "zuzan"
    colCollection.Add "2z"
    colCollection.Add "alpha"

    Set colCollection = fnVarBubbleSort(colCollection)

    For Each varElement In colCollection
        Debug.Print varElement
    Next varElement

    Debug.Print "--------------------"

    Set colCollection = fnVarBubbleSort(colCollection, False)

    For Each varElement In colCollection
        Debug.Print varElement
    Next varElement
End Sub

Он берет коллекцию по ссылке, поэтому она может легко вернуть ее как функцию и имеет необязательный параметр для Сортировка по возрастанию и убыванию. Сортировка возвращает это в ближайшем окне:

2342
2z
alpha
baba
beta
hvarchiloto
na
stackoveflow
ti
vityata
zuzan
zuzana
--------------------
zuzana
zuzan
vityata
ti
stackoveflow
na
hvarchiloto
beta
baba
alpha
2z
2342

13
задан icza 10 September 2015 в 07:18
поделиться

3 ответа

Тип карты. http://golang.org/doc/effective_go.html#maps

Есть некоторое отличие от python в том, что ключи нужно вводить, , поэтому вы не можете смешивать числовые и строковые ключи (почему-то забыл, что можно), но ими довольно легко пользоваться.

dict := make(map[string]string)
dict["user"] = "so_user"
dict["pass"] = "l33t_pass1"
9
ответ дан 1 December 2019 в 19:07
поделиться

Вероятно, вы ищете карту .

0
ответ дан 1 December 2019 в 19:07
поделиться

Чтобы немного расширить уже данные ответы:

Карта Go - это типизированная структура данных хеш-карты. Сигнатура типа карты имеет вид map [keyType] valueType , где keyType и valueType - это типы ключей и значений соответственно.

Чтобы инициализировать карту, вы должны использовать функцию make :

m := make(map[string]int)

Неинициализированная карта равна nil , и при чтении или записи во время выполнения произойдет паника. .

Синтаксис для хранения значений во многом такой же, как и для массивов или срезов:

m["Alice"] = 21
m["Bob"] = 17

Аналогичным образом, получение значений из карты выполняется следующим образом:

a := m["Alice"]
b := m["Bob"]

Вы можете использовать ключевое слово range для перебора карты с помощью цикла for :

for k, v := range m {
    fmt.Println(k, v)
}

Этот код напечатает:

Alice 21
Bob 17

Получение значения для ключа, которого нет на карте, вернет нулевое значение типа значения:

c := m["Charlie"]
// c == 0

Считывая несколько значений с карты, вы можете проверить наличие ключа.Второе значение будет логическим, указывающим на наличие ключа:

a, ok := m["Alice"]
// a == 21, ok == true
c, ok := m["Charlie"]
// c == 0, ok == false

Чтобы удалить запись ключа / значения с карты, вы переверните ее и назначьте false в качестве второго значения:

m["Bob"] = 0, false
b, ok := m["Bob"]
// b == 0, ok == false

Вы можете сохранить произвольные типы на карте с использованием пустого интерфейса type interface {} :

n := make(map[string]interface{})
n["One"] = 1
n["Two"] = "Two"

Единственное условие состоит в том, что при извлечении этих значений вы должны выполнить утверждение типа, чтобы использовать их в исходной форме:

a := n["One"].(int)
b := n["Two"].(string)

Вы можете использовать переключатель типа, чтобы определить типы извлекаемых значений и обработать их соответствующим образом:

for k, v := range n {
    switch u := v.(type) {
        case int:
            fmt.Printf("Key %q is an int with the value %v.\n", k, u)
        case string:
            fmt.Printf("Key %q is a string with the value %q.\n", k, u)
    }
}

Внутри каждого из этих блоков case , u будет типа, указанного в операторе case ; нет необходимости в явном утверждении типа.

Этот код напечатает:

Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".

Ключ может быть любого типа, для которого определен оператор равенства, например целые числа, числа с плавающей запятой, строки и указатели. Типы интерфейсов также могут использоваться, если базовый тип поддерживает равенство. (Структуры, массивы и срезы нельзя использовать в качестве ключей карты, потому что для этих типов равенство не определено.)

Например, карта o может принимать ключи любого из вышеуказанных типов:

o := make(map[interface{}]int)
o[1] = 1
o["Two"] = 2

] И это вкратце карты.

29
ответ дан 1 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: