SlideShare 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

PDF
MagicOnion~C#でゲームサーバを開発しよう~
PPTX
Redisの特徴と活用方法について
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
JVMのGCアルゴリズムとチューニング
PDF
マイクロにしすぎた結果がこれだよ!
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
WebSocket / WebRTCの技術紹介
MagicOnion~C#でゲームサーバを開発しよう~
Redisの特徴と活用方法について
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
SPAセキュリティ入門~PHP Conference Japan 2021
JVMのGCアルゴリズムとチューニング
マイクロにしすぎた結果がこれだよ!
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
WebSocket / WebRTCの技術紹介

What's hot (20)

PPTX
Metaspace
PDF
.NET Core 3.0時代のメモリ管理
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
PDF
3分でわかるAzureでのService Principal
PDF
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
PPTX
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
PPTX
C#や.NET Frameworkがやっていること
PPTX
Redis勉強会資料(2015/06 update)
PDF
Go初心者がGoでコマンドラインツールの作成に挑戦した話
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PDF
MagicOnion入門
PDF
Form認証で学ぶSpring Security入門
PDF
分散トレーシング技術について(Open tracingやjaeger)
PDF
単なるキャッシュじゃないよ!?infinispanの紹介
PDF
Dockerからcontainerdへの移行
PDF
Mavenの真実とウソ
PDF
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
PDF
Docker composeで開発環境をメンバに配布せよ
PDF
マルチテナントのアプリケーション実装〜実践編〜
Metaspace
.NET Core 3.0時代のメモリ管理
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
3分でわかるAzureでのService Principal
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
KubernetesのRBACを掘り下げてみる(Kubernetes Novice Tokyo #17 発表資料)
C#や.NET Frameworkがやっていること
Redis勉強会資料(2015/06 update)
Go初心者がGoでコマンドラインツールの作成に挑戦した話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
MagicOnion入門
Form認証で学ぶSpring Security入門
分散トレーシング技術について(Open tracingやjaeger)
単なるキャッシュじゃないよ!?infinispanの紹介
Dockerからcontainerdへの移行
Mavenの真実とウソ
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Docker composeで開発環境をメンバに配布せよ
マルチテナントのアプリケーション実装〜実践編〜
Ad

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

PPT
C++0x in programming competition
PDF
groovy 2.1.0 20130118
PDF
JavaScript経験者のためのGo言語入門
PDF
C++0x in programming competition
PDF
Python standard 2022 Spring
ODP
GADTブランチの今
PDF
Twitter sphere of #twitter4j #twtr_hack
PPTX
C#6.0の新機能紹介
PPTX
Node.js - JavaScript Thread Programming
PPT
G*workshop sendai 20100424(v2)
C++0x in programming competition
groovy 2.1.0 20130118
JavaScript経験者のためのGo言語入門
C++0x in programming competition
Python standard 2022 Spring
GADTブランチの今
Twitter sphere of #twitter4j #twtr_hack
C#6.0の新機能紹介
Node.js - JavaScript Thread Programming
G*workshop sendai 20100424(v2)
Ad

More from asuka y (6)

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

Go1.18 Genericsを試す