Попробуйте универсальную версию карты и слайса Go 1.18!

Go

Все обращали внимание на новость о том, что Go 1.18 будет поддерживать дженерики.

Как и встроенные типы Golang, все ожидают, что после того, как map и slice будут поддерживать общие типы, можно будет упростить большую часть логики суждений, например логику Equal и так далее.

Несколько дней назад стандартная библиотека парадигм Go была представлена ​​и доступна для ознакомления:

go-generic-exp-module.png

Вы также можете прочитать соответствующий код:На данный момент .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:

golang-nightly-image.png

Затем мы можем запустить среду компиляции 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 не такой полной.. На данный момент Голанг лучше.