Что можно хранить в качестве ключа, если Float не использовать

Для ключей в картах (maps) можно использовать типы, которые удовлетворяют определенным требованиям. Ключи должны быть сравнимыми, то есть поддерживать операторы сравнения (`==` и `!=`). Это означает, что типы, используемые в качестве ключей, должны иметь возможность быть сравнены на равенство. В Go это включает следующие типы:

1. Целые числа (int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64):

  • `map[int]string`, `map[int64]int`

2. Строки (string):

  • `map[string]int`

3. Булевы значения (bool):

  • `map[bool]string`

4. Указатели (например, *int, *struct):

  • `map[*int]string`
  • Указатели сравниваются по их адресам, что делает их допустимыми ключами.

5. Каналы (chan T):

  • `map[chan int]string`
  • Каналы также сравниваются по их адресам.

6. Интерфейсы (при условии, что их конкретные значения сравнимы):

  • `map[interface{}]string`, но конкретные значения, хранимые в интерфейсах, должны быть сравнимы.

7. Структуры (struct):

  • `map[struct{a int; b string}]int`
  • Важно: все поля структуры должны быть сравнимыми, чтобы структура могла быть использована в качестве ключа.

Пример:1. Использование целых чисел в качестве ключей:

   ```go
   package main

   import "fmt"

   func main() {
       intMap := make(map[int]string)
       intMap[1] = "one"
       intMap[2] = "two"
       fmt.Println(intMap) // Output: map[1:one 2:two]
   }
   ```

2. Использование строк в качестве ключей:

   ```go
   package main

   import "fmt"

   func main() {
       stringMap := make(map[string]int)
       stringMap["one"] = 1
       stringMap["two"] = 2
       fmt.Println(stringMap) // Output: map[one:1 two:2]
   }
   ```

3. Использование структур в качестве ключей:

   ```go
   package main

   import "fmt"

   type Person struct {
       FirstName string
       LastName  string
   }

   func main() {
       structMap := make(map[Person]int)
       structMap[Person{"John", "Doe"}] = 1
       structMap[Person{"Jane", "Doe"}] = 2
       fmt.Println(structMap) // Output: map[{John Doe}:1 {Jane Doe}:2]
   }
   ```

4. Использование указателей в качестве ключей:

   ```go
   package main

   import "fmt"

   func main() {
       int1 := 1
       int2 := 2
       ptrMap := make(map[*int]string)
       ptrMap[&int1] = "one"
       ptrMap[&int2] = "two"
       fmt.Println(ptrMap) // Output: map[0x...:one 0x...:two]
   }
   ```

Ограничения

Тип:

  • Хотя типы `float32` и `float64` могут быть использованы, их использование в качестве ключей в картах не рекомендуется из-за проблем с точностью при сравнении плавающих точек.

Срезы (slices):

  • Не могут быть использованы в качестве ключей, потому что они не сравнимы.

Для ключей в картах Go можно использовать типы, которые можно сравнивать на равенство: целые числа, строки, булевы значения, указатели, каналы и структуры (если все их поля сравнимы). Срезы и плавающие точки (float) не рекомендуются из-за проблем с сравнимостью и точностью.

June 2, 2024, easyoffer