狠狠撸

狠狠撸Share a Scribd company logo
Go 1.18
Genericsを試す
OCT 28 2021
Asuka y
...
...
GOGOGOGOGOGOGOGOGOGO
Genericsとは何か 01
GoにおけるGenerics
これまでのGo
これからのGo
02
03
04
Genericsとは何か
01
ジェネリックプログラミング
特定のデータ型に依存しな
いアルゴリズムを記述する
ためのプログラミングスタイ
ル
Generics
01. Genericsとは何か
// 定義
abstract class Iterable<E> {
Iterable<T> map<T>(T toElement(E e)) =>
MappedIterable<E, T>(this, toElement);
}
// 利用
void main() {
final s = <int>[1, 2, 3];
s.map<String>((final n) => "${2 * n}");
}
よくある文法
任意の型E, Tを定
義でき,利用時に型
を指定できる.
メリット
01. Genericsとは何か
+ 共通のコードパターンを共通化することができる.
+ コード量の削减,记述の简略化が可能になる.
GoにおけるGenerics
02
Generics
02. GoにおけるGenerics
// 定義
func Map[E, T any](s []E, f func(E) T) []T {
r := make([]T2, len(s))
for i, v := range s {
r[i] = f(v)
}
return r
}
/*
Goの特徴として,型名を変数名の後ろに書く.
GenericsはGo2で実装されると噂されていたが,Go1で実装される
ことが決定した.
*/
今年1月にAcceptされた.
山括弧<T>ではなく
角括弧[T]が採用さ
れた.
A. 比較演算子の<, >と紛らわしい
a, b = b, a
a, b = w < x, y > (z)
Q. なぜ角括弧[T]なのか
これまでのGo
03
var x interface{}
Switch x.(type) {
case string:
...
}
Interfaceによる実装
03. これまでのGo
Sort(x interface{}, less
func(i, j int) bool) {
...
空Interfaceによって型を抽象化す
ることで任意の型を扱うことはでき
る.
空InterfaceとはJavaなどのObject Classに当たる存在.
空Interface{}を扱う側はCastしな
いと利用できなかい.
go generate ...コマンドを用いて共
通のコードをGenerateする.
> ls -l
wire.go
Wire_gen.go
...
コードの自動生成
03. これまでのGo
//go:generate stringer -type=Pill
Type Pill int
ツールの扱いであったり,色々と煩雑になりやすい.
汎用性は高いが,膨大な自動生成
ファイルができたり,生成ツールの
メンテナンスなどが必要になる.
// Genericsが欲しくなる
// 意外と早い & Genericsがなくてもアプ
リはInterfaceでなんとかなる場合が多い
ひたすらコードを実装する.最初は
これで良い.
とにかく書く
03. これまでのGo
脳内に派閥が形成される.
ライブラリ作成を始めた時に苦しみ
を覚える.
これからのGo
04
Go 1.18ではこう書ける!!
// 定義
func Print[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
// 利用
func main() {
Print([]int{1, 2, 3})
}
04. これからのGo
Go 1.17ではBuildフラグで1.18の機能を試すことができる!!
試してみよう!
Genericsデモ
04. これからのGo
Genericsデモ
04. これからのGo
03
Genericsを試したい
Genericsを試したい
XX. Genericsを試したい
XX
Genericsを試したい
XX. Genericsを試したい
Genericsを試したい
XX. Genericsを試したい
Genericsを試したい
XX. Genericsを試したい
Genericsデモ
04. これからのGo
Genericsデモ
04. これからのGo
Genericsデモ
04. これからのGo
// この形式は構文エラーにはならないが,サポートされない.
func (S) Identity[T any](v T) T { return v }
Genericsデモ
04. これからのGo
No parameterized methods
レシーバメソッドに
は型パラメータを付
けられない.
// --- package p1 ---
type S struct{}
func (S) Identity[T any](v T) T { return v }
// --- package p2 ---
type HasIdentity interface {
Identity[T any](T) T
}
// --- package p3 ---
func CheckIdentity(v interface{}) {
if vi, ok := v.(p2.HasIdentity); ok {
if got := vi.Identity[int](0); got != 0 {
// --- package p4 ---
func CheckSIdentity() {
p3.CheckIdentity(p1.S{})
Genericsデモ
04. これからのGo
package p3がp1.S
の型を推論できな
い.JITを使えばで
きるけど,Goはそん
なことをやりたくな
い.
No parameterized methods
Genericsデモ
04. これからのGo
Genericsデモ
04. これからのGo
// この形式は構文エラーにはならないが,サポートされない.
func (S) Identity[T any](v T) T { return v }
// Interfaceは許される
type Identify[T any] interface {
Identity(v T) T
}
// レシーバメソッドに型パラメータを持たない場合は許される
type Slice[T any] []T
func (s Slice[T]) Identity(v T) T { return v }
Genericsデモ
04. これからのGo
No parameterized methods
Interfaceや型定義
に型パラメータを持
たせる記述は可能.
Genericsデモ
04. これからのGo
Genericsデモ
04. これからのGo
// 並べられるという制約を定義
type Ordered interface {
// 型を列挙できる
// 「~int」は「int」を基底に持つ型を内包できる
~int | ~uint | string
}
func Smallest[T Orderd] (x, y T) T {
if x < y {
return x
}
return y
}
Genericsデモ
04. これからのGo
Constraint elements
Interfaceに制約を
持たせる文法が追
加された.
Genericsデモ
04. これからのGo
Genericsデモ
04. これからのGo
Go 1.18 release in early 2022.
Go1.18 Genericsを試す

More Related Content

What's hot (20)

スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
?
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
Noriyoshi Shinoda
?
より深く知るオフ?ティマイサ?とそのチューニング
より深く知るオフ?ティマイサ?とそのチューニングより深く知るオフ?ティマイサ?とそのチューニング
より深く知るオフ?ティマイサ?とそのチューニング
Yuto Hayamizu
?
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
NTT DATA Technology & Innovation
?
マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁
マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁
マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁
disc99_
?
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Platform - Japan
?
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
?
10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF
Shuji Yamada
?
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
Toru Makabe
?
コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」
コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」
コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」
Masahito Zembutsu
?
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザ
Noritaka Sekiyama
?
ストリーム処理を支えるキューイングシステムの选び方
ストリーム処理を支えるキューイングシステムの选び方ストリーム処理を支えるキューイングシステムの选び方
ストリーム処理を支えるキューイングシステムの选び方
Yoshiyasu SAEKI
?
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi
?
顿辞肠办别谤と笔辞诲尘补苍の比较
顿辞肠办别谤と笔辞诲尘补苍の比较顿辞肠办别谤と笔辞诲尘补苍の比较
顿辞肠办别谤と笔辞诲尘补苍の比较
Akihiro Suda
?
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
?
叠耻颈濒诲碍颈迟の概要と最近の机能
叠耻颈濒诲碍颈迟の概要と最近の机能叠耻颈濒诲碍颈迟の概要と最近の机能
叠耻颈濒诲碍颈迟の概要と最近の机能
Kohei Tokunaga
?
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
NTT DATA Technology & Innovation
?
マルチテナントのアプリケーション実装?実践编?
マルチテナントのアプリケーション実装?実践编?マルチテナントのアプリケーション実装?実践编?
マルチテナントのアプリケーション実装?実践编?
Yoshiki Nakagawa
?
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Preferred Networks
?
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
?
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
?
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
Noriyoshi Shinoda
?
より深く知るオフ?ティマイサ?とそのチューニング
より深く知るオフ?ティマイサ?とそのチューニングより深く知るオフ?ティマイサ?とそのチューニング
より深く知るオフ?ティマイサ?とそのチューニング
Yuto Hayamizu
?
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
NTT DATA Technology & Innovation
?
マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁
マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁
マイクロサービスバックエンド础笔滨のための搁贰厂罢と驳搁笔颁
disc99_
?
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Platform - Japan
?
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
?
10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF
Shuji Yamada
?
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
Toru Makabe
?
コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」
コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」
コンテナの作り方「顿辞肠办别谤は里方で何をしているのか?」
Masahito Zembutsu
?
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザ
Noritaka Sekiyama
?
ストリーム処理を支えるキューイングシステムの选び方
ストリーム処理を支えるキューイングシステムの选び方ストリーム処理を支えるキューイングシステムの选び方
ストリーム処理を支えるキューイングシステムの选び方
Yoshiyasu SAEKI
?
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi
?
顿辞肠办别谤と笔辞诲尘补苍の比较
顿辞肠办别谤と笔辞诲尘补苍の比较顿辞肠办别谤と笔辞诲尘补苍の比较
顿辞肠办别谤と笔辞诲尘补苍の比较
Akihiro Suda
?
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
?
叠耻颈濒诲碍颈迟の概要と最近の机能
叠耻颈濒诲碍颈迟の概要と最近の机能叠耻颈濒诲碍颈迟の概要と最近の机能
叠耻颈濒诲碍颈迟の概要と最近の机能
Kohei Tokunaga
?
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
NTT DATA Technology & Innovation
?
マルチテナントのアプリケーション実装?実践编?
マルチテナントのアプリケーション実装?実践编?マルチテナントのアプリケーション実装?実践编?
マルチテナントのアプリケーション実装?実践编?
Yoshiki Nakagawa
?
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Preferred Networks
?
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
?

Similar to Go1.18 Genericsを試す (10)

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
?
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118
Uehara Junji
?
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
Shohei Arai
?
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
?
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
anyakichi
?
骋础顿罢ブランチの今
骋础顿罢ブランチの今骋础顿罢ブランチの今
骋础顿罢ブランチの今
啓 小笠原
?
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
kimukou_26 Kimukou
?
颁#6.0の新机能绍介
颁#6.0の新机能绍介颁#6.0の新机能绍介
颁#6.0の新机能绍介
Kazunori Hamamoto
?
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
takesako
?
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
Nobuhiro Sue
?
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
?
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118
Uehara Junji
?
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
Shohei Arai
?
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
?
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
anyakichi
?
骋础顿罢ブランチの今
骋础顿罢ブランチの今骋础顿罢ブランチの今
骋础顿罢ブランチの今
啓 小笠原
?
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
kimukou_26 Kimukou
?
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
takesako
?
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
Nobuhiro Sue
?

More from asuka y (6)

易しい痴颈尘
易しい痴颈尘易しい痴颈尘
易しい痴颈尘
asuka y
?
Async await完全に理解した
Async await完全に理解したAsync await完全に理解した
Async await完全に理解した
asuka y
?
Flutter2
Flutter2Flutter2
Flutter2
asuka y
?
办8蝉クラスタ构筑
办8蝉クラスタ构筑办8蝉クラスタ构筑
办8蝉クラスタ构筑
asuka y
?
自宅ネットワーク构筑
自宅ネットワーク构筑自宅ネットワーク构筑
自宅ネットワーク构筑
asuka y
?
颁础厂尝2実行环境绍介
颁础厂尝2実行环境绍介颁础厂尝2実行环境绍介
颁础厂尝2実行环境绍介
asuka y
?
易しい痴颈尘
易しい痴颈尘易しい痴颈尘
易しい痴颈尘
asuka y
?
Async await完全に理解した
Async await完全に理解したAsync await完全に理解した
Async await完全に理解した
asuka y
?
办8蝉クラスタ构筑
办8蝉クラスタ构筑办8蝉クラスタ构筑
办8蝉クラスタ构筑
asuka y
?
自宅ネットワーク构筑
自宅ネットワーク构筑自宅ネットワーク构筑
自宅ネットワーク构筑
asuka y
?
颁础厂尝2実行环境绍介
颁础厂尝2実行环境绍介颁础厂尝2実行环境绍介
颁础厂尝2実行环境绍介
asuka y
?

Go1.18 Genericsを試す