Все обращали внимание на новость о том, что Go 1.18 будет поддерживать дженерики.
Как и встроенные типы Golang, все ожидают, что после того, как map и slice будут поддерживать общие типы, можно будет упростить большую часть логики суждений, например логику Equal и так далее.
Несколько дней назад стандартная библиотека парадигм Go была представлена и доступна для ознакомления:
Вы также можете прочитать соответствующий код:На данный момент .open source.Google/go/small/exp/+/…
Без дальнейших церемоний, давайте посмотрим, как опробовать универсальные версии map и slice!
Как использовать Go 1.18?
Официальный сайт Golang ссылается на скачивание только версии 1.17, то как мы можем использовать версию Golang 1.18?
Я подключился к Интернету, некоторые люди предоставляют версию Golang 1.18 зеркала Docker.seongwoohong/golang-nightly:1.18
, и он гарантированно будет поддерживаться до официального выпуска версии 1.18:
Затем мы можем запустить среду компиляции go1.18 с помощью следующей команды:
$ docker run --rm -it -v $PWD:/root/go-generics seongwoohong/golang-nightly:1.18 sh
# cd /root/go-generics/
~/go-generics #
попробовать карты
После просмотра кода и тестовых примеров карт используйте следующий код для демонстрации функций карт:
package main
import (
"fmt"
"strconv"
"golang.org/x/exp/maps" // v0.0.0-20211129234152-8a230f1f7d7a
)
func main() {
var m1 = map[int]int{1: 2, 2: 4, 4: 8, 8: 16}
var m2 = map[string]string{"1": "2", "2": "4", "4": "8", "8": "16"}
var m3 = map[int]string{1: "2", 2: "4", 4: "8", 8: "16"}
// Keys 方法返回map的所有键
// 如果没有范型,那么对于每种map,都需要写Keys方法,现在只需要一个
fmt.Printf("m1 Keys:\t%#v\n", maps.Keys(m1))
fmt.Printf("m2 Kyes:\t%#v\n", maps.Keys(m2))
// Values 方法返回map的所有值
fmt.Printf("m1 Values:\t%#v\n", maps.Values(m1))
fmt.Printf("m2 Values:\t%#v\n", maps.Values(m2))
// 判断map是否相等
fmt.Println("m1==m1?\t", maps.Equal(m1, m1))
fmt.Println("m2==m2?\t", maps.Equal(m2, m2))
//fmt.Println(maps.Equal(m1, m2))
// map[int]int与map[string]string无法比较
// 判断map是否相等(手动指定判断逻辑)
fmt.Println("m1==m3?\t", maps.EqualFunc(m1, m3, func(v1 int, v2 string) bool {
return strconv.Itoa(v1) == v2
}))
// 还有一些Clear、Clone、Copy、DeleteFunc,都是见名知义的函数
}
Затем скомпилируйте и выполните, чтобы увидеть:
# go build -gcflags="-G=3 -lang=go1.18"
# ./m
m1 Keys: []int{1, 2, 4, 8}
m2 Kyes: []string{"8", "1", "2", "4"}
m1 Values: []int{2, 4, 8, 16}
m2 Values: []string{"16", "2", "4", "8"}
m1==m1? true
m2==m2? true
m1==m3? true
попробовать кусочки
Точно так же, просматривая код и тестовые примеры слайсов, вы можете использовать следующий код для демонстрации функции слайсов:
package main
import (
"fmt"
"strconv"
"golang.org/x/exp/slices" // v0.0.0-20211129234152-8a230f1f7d7a
)
func main() {
var s1 = []int{1, 2, 3}
var s2 = []string{"1", "2", "3"}
// 判断slice是否相等
fmt.Println("s1==s1?\t", slices.Equal(s1, s1))
fmt.Println("s2==s2?\t", slices.Equal(s2, s2))
//fmt.Println(slices.Equal(s1, s2))
//[]int与[]string无法比较
// 判断slice是否相等(手动指定判断逻辑)
fmt.Println("s1==s2?\t", slices.EqualFunc(s1, s2, func(v1 int, v2 string) bool {
return strconv.Itoa(v1) == v2
}))
// 在slice中查找某个元素
fmt.Printf("s1[%v]=%d\n", slices.Index(s1, 2), 2)
fmt.Printf("s1[%v]=%d\n", slices.Index(s1, 999), 999)
// 还有一些Clear、Clone、Copy、DeleteFunc,都是见名知义的函数
}
Его также можно скомпилировать и выполнить:
# go build -gcflags="-G=3 -lang=go1.18"
# ./m
s1==s1? true
s2==s2? true
s1==s2? true
s1[1]=2
s1[-1]=999
Суммировать
По сравнению с парадигмой Java, Golang действительно соответствует парадигме времени выполнения, что может повысить эффективность.
важнее,Как ранее жаловался Ван Инь, массивы Java не поддерживают универсальные типы, что делает систему типов Java не такой полной.. На данный момент Голанг лучше.