Что можно хранить в качестве ключа, если 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