---
title: 発表資料 - Gophers Meetup 2026
tags: 
author: [Haruki Shimizu](https://image.docswell.com/user/shumizu418128)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/4JMYM3ZVJW.jpg?width=480
description: https://tokium.connpass.com/event/405908/
published: October 08, 26
canonical: https://image.docswell.com/s/shumizu418128/K7ND2G-2026-10-08-201105
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/4JMYM3ZVJW.jpg)

Jev-goから学ぶ
型安全ってなんだろう
haruki


# Page. 2

![Page Image](https://bcdn.docswell.com/page/PJR9VQ6W79.jpg)

自己紹介
haruki
モビルス株式会社 2026新卒
Go conference 2026 初参加


# Page. 3

![Page Image](https://bcdn.docswell.com/page/PEXQZ5MVJX.jpg)

Jev
先月登場して話題になった Jev
早速使うために SDK について調べてみました


# Page. 4

![Page Image](https://bcdn.docswell.com/page/3EK986G5ED.jpg)

Jev SDK
Python
JavaScript / TypeScript
Go はない


# Page. 5

![Page Image](https://bcdn.docswell.com/page/L73W26N175.jpg)

ないなら作る！
ということで Jev-go を作ってみよう...


# Page. 6

![Page Image](https://bcdn.docswell.com/page/87DKZVWKJG.jpg)

もうありました。
kataras/jev
valksor/typesafe-sdk-go
FelineStateMachine/typesafe-go
shanehull/go-jev
mattn/go-jev
waygatetech/jev-go
tgallice/jev-go
anilsenay/jev
fgn/jevgo
havlan/jev-go


# Page. 7

![Page Image](https://bcdn.docswell.com/page/VJPKDV93E8.jpg)

めっちゃあった
それぞれの特徴を比較してみました


# Page. 8

![Page Image](https://bcdn.docswell.com/page/2EVV1ZMNEQ.jpg)

比較
1. バージョン
2. 型の扱い


# Page. 9

![Page Image](https://bcdn.docswell.com/page/57GL24G5EL.jpg)

1. バージョン
go.mod の宣言と、実際に必要なバージョン


# Page. 10

![Page Image](https://bcdn.docswell.com/page/4EQYPGXLJP.jpg)

go.mod の宣言
各ライブラリが宣言している Go のバージョン
1.27
kataras / Feline / mattn
1.25
1.26
tgallice / fgn / valksor / shanehull / waygatetech
1.22
anilsenay / havlan
〜


# Page. 11

![Page Image](https://bcdn.docswell.com/page/KJ4WY56571.jpg)

実際に必要なバージョン
使っている機能から逆算すると
1.27
kataras / Feline（generic methods、json/v2）
1.22〜
tgallice / fgn / valksor / anilsenay（slog、rand/v2）
1.24
≤ 1.21
mattn / shanehull / waygatetech / havlan


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LE1Y6WV27G.jpg)

go.mod の宣言とのずれ
宣言どおり必要なのは 10 個中 3 個だけ
一致：kataras / Feline / anilsenay
残り 7 個は、宣言が実際より新しい


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GEWGW6L2J2.jpg)

2. 型の扱い
質問ごとに違う型の「答え」をどう返すか


# Page. 14

![Page Image](https://bcdn.docswell.com/page/47ZL5YM4J3.jpg)

3つの作戦
答えは Noul / Choice / Score の3種類
A 1つの構造体に全部入れる
B interface と型アサーション
C ジェネリクス


# Page. 15

![Page Image](https://bcdn.docswell.com/page/YJ6W9DNGJV.jpg)

作戦A：1つの構造体
3種類の答えのフィールドを並べる（mattn/go-jev）
type Answer struct {
Type string; Noul float64; Choice string; ...
}


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GJ5MN35XJ4.jpg)

作戦A：1つの構造体
いちばん分かりやすい。でも…
と直接読める。型アサーション不要
Noul の答えで a.Choice を読んでも空文字が返るだけ
→ 間違いに気づけない
a.Choice


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LE3W26N4E5.jpg)

作戦B：interface と型アサーション
型アサーションをメソッドの中に隠す（kataras/jev など）
func (r *Response) Choice(name string) (ChoiceAnswer, bool) {
a, ok := r.Answers[name].(ChoiceAnswer)
return a, ok }


# Page. 18

![Page Image](https://bcdn.docswell.com/page/8EDKZVW57G.jpg)

作戦B：interface と型アサーション
いちばん多く採用されている作戦
ans, ok := res.Choice(&quot;team&quot;)
型が違えば ok == false が返る
→ 実行時に気づける
と書くだけ


# Page. 19

![Page Image](https://bcdn.docswell.com/page/V7PKDV9DJ8.jpg)

作戦B：interface と型アサーション
kataras/jev のひと工夫
type Question interface { isQuestion() }
小文字のメソッドはパッケージの外から実装できない
→ ライブラリが定義した型しか入らない


# Page. 20

![Page Image](https://bcdn.docswell.com/page/2JVV1ZMGJQ.jpg)

作戦C：ジェネリクス
型を引数のように受け取れる（Go 1.18〜）
func First[T any](xs []T) T { return xs[0] }
First([]int{1, 2})
// int
First([]string{&quot;a&quot;})
// string
が返る
が返る


# Page. 21

![Page Image](https://bcdn.docswell.com/page/5EGL24XDJL.jpg)

作戦C：ジェネリクス
答えの型を先に用意しておく（tgallice/jev-go）
team := jev.Ask(req, &quot;team&quot;, jev.Choice(...))
res, _ := client.Evaluate(ctx, req)
a, _ := team.Answer(res) // a
ChoiceAnswer
は
型


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4JQYPG8X7P.jpg)

作戦C：ジェネリクス
型アサーションそのものが不要になる
作戦B：実行時に「ChoiceAnswer のはず」と確かめる
作戦C：コンパイル時点で答えの型が決まっている
→ 間違えたら実行前にコンパイルエラー


# Page. 23

![Page Image](https://bcdn.docswell.com/page/K74WY522E1.jpg)

作戦採用状況
型を間違えたとき、いつ気づけるか
A 気づかない
B 実行時
C コンパイル時
mattn / waygatetech（havlan は実行時）
shanehull / valksor / fgn / kataras / Feline
tgallice / anilsenay


# Page. 24

![Page Image](https://bcdn.docswell.com/page/LJ1Y6WMKEG.jpg)

まとめ
同じ目的でも、型/バージョンの考え方で
実装が大きく異なる


# Page. 25

![Page Image](https://bcdn.docswell.com/page/GJWGW63P72.jpg)

おまけ
Jev についてブログ書きました
Ask me anything情報あるよ


