SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
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を試す

Más contenido relacionado

La actualidad más candente

Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界Yoshinori Nakanishi
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
PyMCがあれば,ベイズ推定でもう泣いたりなんかしない
PyMCがあれば,ベイズ推定でもう泣いたりなんかしないPyMCがあれば,ベイズ推定でもう泣いたりなんかしない
PyMCがあれば,ベイズ推定でもう泣いたりなんかしないToshihiro Kamishima
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
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
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...Preferred Networks
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
情報アクセス技術のためのテストコレクション作成
情報アクセス技術のためのテストコレクション作成情報アクセス技術のためのテストコレクション作成
情報アクセス技術のためのテストコレクション作成kt.mako
 
分散システム読書会 06章-同期(前編)
分散システム読書会 06章-同期(前編)分散システム読書会 06章-同期(前編)
分散システム読書会 06章-同期(前編)Ichiro TAKAHASHI
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門ryosuke-kojima
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」ManaMurakami1
 

La actualidad más candente (20)

Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
PyMCがあれば,ベイズ推定でもう泣いたりなんかしない
PyMCがあれば,ベイズ推定でもう泣いたりなんかしないPyMCがあれば,ベイズ推定でもう泣いたりなんかしない
PyMCがあれば,ベイズ推定でもう泣いたりなんかしない
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
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 発表資料)
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
情報アクセス技術のためのテストコレクション作成
情報アクセス技術のためのテストコレクション作成情報アクセス技術のためのテストコレクション作成
情報アクセス技術のためのテストコレクション作成
 
分散システム読書会 06章-同期(前編)
分散システム読書会 06章-同期(前編)分散システム読書会 06章-同期(前編)
分散システム読書会 06章-同期(前編)
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
 

Similar a Go1.18 Genericsを試す

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118Uehara Junji
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門Shohei Arai
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Springanyakichi
 
GADTブランチの今
GADTブランチの今GADTブランチの今
GADTブランチの今啓 小笠原
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programmingtakesako
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)Nobuhiro Sue
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案yushin_hirano
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章Tomonobu_Hirano
 

Similar a Go1.18 Genericsを試す (12)

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
 
GADTブランチの今
GADTブランチの今GADTブランチの今
GADTブランチの今
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 

Más de asuka y

易しいVim
易しいVim易しいVim
易しいVimasuka y
 
Async await完全に理解した
Async await完全に理解したAsync await完全に理解した
Async await完全に理解したasuka y
 
Flutter2
Flutter2Flutter2
Flutter2asuka y
 
k8sクラスタ構築
k8sクラスタ構築k8sクラスタ構築
k8sクラスタ構築asuka y
 
自宅ネットワーク構築
自宅ネットワーク構築自宅ネットワーク構築
自宅ネットワーク構築asuka y
 
CASL2実行環境紹介
CASL2実行環境紹介CASL2実行環境紹介
CASL2実行環境紹介asuka y
 

Más de asuka y (6)

易しいVim
易しいVim易しいVim
易しいVim
 
Async await完全に理解した
Async await完全に理解したAsync await完全に理解した
Async await完全に理解した
 
Flutter2
Flutter2Flutter2
Flutter2
 
k8sクラスタ構築
k8sクラスタ構築k8sクラスタ構築
k8sクラスタ構築
 
自宅ネットワーク構築
自宅ネットワーク構築自宅ネットワーク構築
自宅ネットワーク構築
 
CASL2実行環境紹介
CASL2実行環境紹介CASL2実行環境紹介
CASL2実行環境紹介
 

Go1.18 Genericsを試す