SlideShare a Scribd company logo
Javaプログラマのための
頑張らないGo入門
JJUG CCC 2019 Fall
#ccc_g2 #jjug_ccc
@yy_yank
#ccc_g2 #jjug_ccc
でつぶやいてください
ハッシュタグ TODOハッシュタグ
自己紹介
やんく(@yy_yank) こいつです
・(株)Abbyのプログラマ
・JJUG CCC登壇4回目?
・iconはsakuraエディタなのに
・vim使う
・Java,Kotlin,Goが好き
「あれ、JavaのカンファレンスでGoの話するの
か?するのか。いいのか?」

採用されて我に返った僕

頑張らないって

タイトルにしたけど

頑張っていきましょう

でもGoを知る近道にはな
るかも?

というセッション

(にしたい)

このセッションは
Goを知り興味を持つきっかけ
という位置付けです。
Goを深く学びたい方向けではありません。
NOTENOTE
・このセッションは個人の感想です。所属企業のうん
ぬんかんぬんではありません。
・ワタシJavaスキ
・ワタシGoもスキ
・言語がスキ
NOTE
・もちろん主観はありますが、それぞれの言語に対し
てフェアに
・良いところを伝えていければ
・Javaの話ほとんどないです
NOTENOTE
・Goってあれでしょ?電車でGoだよね
・なんかGoっていう言語があるらしい
・Go気になるのでちょっととっかかりが欲しい
ぐらいの人
ここにいる人の想定
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
・イントロダクション(僕の思うGoとJava) 冒頭から含めて15分
・Goことはじめ 7分
・Goってこんなコード 9分
・Goの特徴 10分
・Go使いはじめ(yy_yank目線) 4.5分
・Goを使ってハマった編(yy_yank目線) 2分
・まとめ 0.5分
アジェンダ発表練習時 RTA(Real Time Attack)の結果です
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
イントロダクションという名の
言いたいこと先に言っとくやつ
「GoとJavaを並べるのは筋が悪い」

架空の人:

「わかる」

ぼく:

・JavaとGoを比べるのは筋が悪い(と思う)
・Javaならこう出来る…を捨てる
・しかし、言語に対してフェアに
・他の言語を知ってると、Goを一通り触らないと良い言語には感じ
ないのではと思う(食わず嫌い的な)
→なんかWebアプリでも作ってみて欲しい
イントロダクション(僕の思うGoとJava)
・すべてを忘れてGoを書いてみるとジワジワ良さを感じてくる(効
果には個人差があります)
・なんか物足りねえけどなんとかなるなぁみたいな
・ほーいいじゃないか、こういうのでいいんだよこういうので(出典:
孤独のグルメ)
イントロダクションイントロダクション(僕の思うGoとJava)
・Goはコンパイルが速くメモリを食いにくい
→開発(者)に優しい
・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
→開発(者)に優しいかもしれないけど、
メモリには厳しい
イントロダクションイントロダクション(僕の思うGoとJava)
・Goはコンパイルが速くメモリを食いにくい
→開発(者)に優しい
・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
→開発(者)に優しいかもしれないけど、
メモリには厳しい
イントロダクションイントロダクション(僕の思うGoとJava)
goルーチンはすげえ軽い。Javaの
スレッドは1スレッド固定長1MB(デ
フォルト)、goルーチンは4KBの動的
割り当て
・Goはコンパイルが速くメモリを食いにくい
→開発(者)に優しい
・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
→開発(者)に優しいかもしれないけど、
メモリには厳しい
イントロダクションイントロダクション(僕の思うGoとJava)Why you can have millions of
Goroutines but only thousands
of Java Threads で検索
https://rcoh.me/posts/why-you
-can-have-a-million-go-routines-
but-only-1000-java-threads/
・Goはコンパイルが速くメモリを食いにくい
→開発(者)に優しい
・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
→開発(者)に優しいかもしれないけど、
メモリには厳しい
イントロダクションイントロダクション(僕の思うGoとJava)
graalあたりで頑張るで!
(今後数年が楽しみ)
・Goはコンパイルが速くメモリを食いにくい
→開発(者)に優しい
・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
→開発(者)に優しいかもしれないけど、
メモリには厳しい
イントロダクションイントロダクション(僕の思うGoとJava)
channelでmessage passingがとて
も楽。そしていろんなパターンが出
来る
・Goはコンパイルが速くメモリを食いにくい
→開発(者)に優しい
・Javaは速いんだけどなんだかんだメモリ食ってしまいがち
→開発(者)に優しいかもしれないけど、
メモリには厳しい
イントロダクションイントロダクション(僕の思うGoとJava)
Go Concurrency Patterns で検索
https://talks.golang.org/2012/c
oncurrency.slide#1
・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも
ない)
・しかしJavaのようにGoを書こうとするとこじれる
・GoらしくGoを書くのが良い
→だがそれが難しい(業務で感じたところ←今ココ)
イントロダクションイントロダクション(僕の思うGoとJava)
・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも
ない)
・しかしJavaのようにGoを書こうとするとこじれる
・GoらしくGoを書くのが良い
→だがそれが難しい
イントロダクションイントロダクション(僕の思うGoとJava)
Goの方が得意そうなのはTUI、
CLI(コマンド)系、並行処理(記述が
簡単という意味では)
・Javaで作れるものは割とGoで作れる(別に低レイヤーのみでも
ない)
・しかしJavaのようにGoを書こうとするとこじれる
・GoらしくGoを書くのが良い
→だがそれが難しい
イントロダクションイントロダクション(僕の思うGoとJava)
Goで何を作ることが出来るかわかる
良い資料(日本語)
What you can do with Go
https://speakerdeck.com/po3rin
/what-you-can-do-with-go
・JavaもGoも開発のための手段
・手段だけどプログラマにとって大事なもの、選べる手段は多い方
が良い
・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出
来る(TUIやCUIなど)
・メモリ食いにくいので手軽
イントロダクションイントロダクション(僕の思うGoとJava)
・JavaもGoも開発のための手段
・手段だけどプログラマにとって大事な道具、選べる道具は多い
方が良い
・GoはJavaの代替にもなるし、Javaでは扱いにくい部分も対応出
来る(TUIやCUIなど)
・メモリ食いにくいので手軽
イントロダクションイントロダクション(僕の思うGoとJava)
手札を増やしてみませんか?
というのがJavaプログラマへ僕か
ら出来るGoのススメ
(Java好きの人はJavaがとても好きなの知ってるけど )
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
・言い尽くされているがGoに入ればGoに従え
Goの目指しているところを知って、それに乗れば自然とうまくいく
はず
・Goは素直なようでクセがある
GoことはじめGoことはじめ
Go言語の初心者が見ると幸せになれる場所 #golang
https://qiita.com/tenntenn/items/0e33a4959250d1a5504
5
Goことはじめ(Goに従う情報源)
迷える人にオススメ
Goことはじめ(Goに従う情報源)
A Tour of Go
http://go-tour-jp.appspot.com/#1
Goことはじめ(Goに従う情報源)
ササッと触ってみたい
人向け
Goことはじめ(Goに従う情報源)
Frequently Asked Questions (FAQ)
https://golang.org/doc/faq
Goことはじめ(Goに従う情報源)
色々気になることが
多い人向け
Goことはじめ(Goに従う情報源)
みんなのGo言語
Goことはじめ(Goに従う情報源)
実用的な軽めの本読みたい人向け
パラパラ漫画したい人向け
Goことはじめ(Goに従う情報源)
プログラミング言語Go(がっつり言語仕様知りたい人)
Go言語による並行処理(goルーチンあたり知りたい人)
Goならわかるシステムプログラミング(良い本)
Goことはじめ(Goに従う情報源)
しっかり
本読みたい人向け
Goことはじめ(Goに従う情報源)
Effective Go
https://golang.org/doc/effective_go.html
Goことはじめ(Goに従う情報源)
Go書いてて指針が
欲しい人向け
Goことはじめ(Goに従う情報源)
Go Patterns
http://tmrts.com/go-patterns/
Goことはじめ(Goに従う情報源)
builderパターンとか
Functional Optionとか
たまに便利
Goことはじめ(Goに従う情報源)
Standard Go Project Layout
https://github.com/golang-standards/project-layout
Goことはじめ(Goに従う情報源)
名前に困ったら。
あくまで参考程度に
Goことはじめ(Goに従う情報源)
Awesome Go
https://awesome-go.com/
Goことはじめ(Goに従う情報源)
イケてるライブラリを
使おう(ご利用は計画的に)
Goことはじめ(Goに従う情報源)
uber-go/guide
https://github.com/uber-go/guide
Goことはじめ(Goに従う情報源)
最近話題になってました。参
考程度に
Goことはじめ(Goに従う情報源)
注意:
golang.jpは情報が更新されなくなっています。
古いものという前提で軽い参考程度になら良いかもしれない
Goことはじめ(Goに従う情報源)Goことはじめ(Goに従う情報源)
IDEなど開発環境は…?
・一番有力なのはVScode
・年貢収めている人ならGoland、IntelliJ IDEA有料版
・vimやemacsでもいける
・gopls使っていきましょう https://github.com/golang/go/wiki/gopls
Goことはじめ(開発環境)Goことはじめ(Goに従う情報源)
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
※コード例がいくつか出ますが、
一旦ざっくり把握してもらえれば良いです。
時間の都合上
色々説明が不足していますので、
雰囲気だけでも感じてください。
NOTENOTE
err := hoge();
if err != nil {
log.Error(err)
}
Goってこんなコード
・if err != nil
Goってこんなコード
err := hoge();
if err != nil {
log.Error(err)
}
Goってこんなコード
・if err != nil
Goってこんなコード
if err != nil でイディオムとして覚え
て良いぐらい頻出
if err := hoge(); err != nil {
log.Error(err)
}
Goってこんなコード
・if err != nil
Goってこんなコードまたは、ココでこう
if err := hoge(); err != nil {
log.Error(err)
}
Goってこんなコード
・if err != nil
Goってこんなコード
Exceptionない
例外機構ない
err != nil、ただそれだけ
if err := hoge(); err != nil {
log.Error(err)
}
Goってこんなコード
・if err != nil
Goってこんなコード
pkg/errorsか
xerrorsを使っていきましょう
(今後は多分xerrors)
if err := hoge(); err != nil {
log.Error(err)
}
Goってこんなコード
・if err != nil
Goってこんなコード
errは関数の戻り値の
一番最後というキマリ↓
たとえば
func makeStr() (string, error)
戻り値は多値に出来る
m := map[string]string{}
m["a"] = "aaaa"
fmt.Println(m)
//-=> map[a:aaaa]
Goってこんなコード
・map
Goってこんなコード
m := map[string]string{}
m["a"] = "aaaa"
fmt.Println(m)
//-=> map[a:aaaa]
Goってこんなコード
・map
Goってこんなコード
普通にマップです
if v, ok := m["a"]; ok {
fmt.Printf("key=%v:value=%v", "a", v)
}
Goってこんなコード
・map
Goってこんなコード
contains的なのは
こうやる
hoges := []string{}
hoges = append(hoges, “a”)
hoges = append(hoges, “b”)
hoges = append(hoges, “c”)
fmt.Println(hoges)
// => [a, b, c]
Goってこんなコード
・slice append
Goってこんなコード
hoges := []string{}
hoges = append(hoges, “a”)
hoges = append(hoges, “b”)
hoges = append(hoges, “c”)
fmt.Println(hoges)
// => [a, b, c]
Goってこんなコード
・slice append
Goってこんなコード これがslice
hoges := []string{}
hoges = append(hoges, “a”)
hoges = append(hoges, “b”)
hoges = append(hoges, “c”)
fmt.Println(hoges)
// => [a, b, c]
Goってこんなコード
・slice append
Goってこんなコード append….append...ap
pend…..
hoges := []string{}
hoges = append(hoges, “a”)
hoges = append(hoges, “b”)
hoges = append(hoges, “c”)
fmt.Println(hoges)
// => [a, b, c]
Goってこんなコード
・slice append
Goってこんなコード
sliceはざっくりいうと
可変配列のようなもの
配列を使った方が良い場合もあり。
カジュアルにappendしまくると計算量に
よっては…(ご利用は計画的に)
for _, hoge := range hoges {
fmt.Print(hoge)
}
// => a b c
Goってこんなコード
・range
Goってこんなコード
for _, hoge := range hoges {
fmt.Print(hoge)
}
// => a b c
Goってこんなコード
・range
Goってこんなコード
さっきのslice
[a, b, c] です
for _, hoge := range hoges {
fmt.Print(hoge)
}
// => a b c
Goってこんなコード
・range
Goってこんなコード
rangeで添字と要素を取
得できる
_ で添字は無視、要素
のみhogeに格納
for k, v := range m {
fmt.Printf("key=%v:value=%v", k, v)
}
// => key=a:value=aaaa
Goってこんなコード
・range
Goってこんなコード
for k, v := range m {
fmt.Printf("key=%v:value=%v", k, v)
}
// => key=a:value=aaaa
Goってこんなコード
・range
Goってこんなコード
さっきのmapのmさん
[a:aaaa] です
for k, v := range m {
fmt.Printf("key=%v:value=%v", k, v)
}
// => key=a:value=aaaa
Goってこんなコード
・range
Goってこんなコード
mapのkeyとvalueを
格納できます
func deferSample() {
defer fmt.Print("a")
fmt.Print("b")
fmt.Print("c")
}
// => b c a
Goってこんなコード
・defer
Goってこんなコード
func deferSample() {
defer fmt.Print("a")
fmt.Print("b")
fmt.Print("c")
}
// => b c a
Goってこんなコード
・defer
Goってこんなコード Javaで言うところのfinally
deferでclose処理とかしたりする
func highOrderFunc(
beforeFunc func(),
action func()) {
beforeFunc()
action()
}
Goってこんなコード
・高階関数
Goってこんなコード
highOrderFunc(
func() { fmt.Print("前処理") },
func() { fmt.Print("処理実行") },
)
// => 前処理 処理実行
Goってこんなコード
・高階関数
Goってこんなコード
highOrderFunc(
func() { fmt.Print("前処理") },
func() { fmt.Print("処理実行") },
)
// => 前処理 処理実行
Goってこんなコード
・高階関数
Goってこんなコード
AOP的なことをやったりとか。
middlewareという
呼ばれ方が多い印象
GoってこんなコードGoってこんなコード
for _, sut := range []struct {
value string
description string
}{
{value: "1", description: "1です"},
{value: "2", description: "2です"},
{value: "3", description: "3です"},
} {
if !isNumeric(sut.value) {
t.Errorf("expected number , but actual %s. test case :%s", sut.value, sut.description)
}
}
・テーブルドリブンテスト
・テーブルドリブンテスト
GoってこんなコードGoってこんなコード
for _, sut := range []struct {
value string
description string
}{
{value: "1", description: "1です"},
{value: "2", description: "2です"},
{value: "3", description: "3です"},
} {
if !isNumeric(sut.value) {
t.Errorf("expected number , but actual %s. test case :%s", sut.value, sut.description)
}
}
testケースをガッとまとめて
(語彙力)
・テーブルドリブンテスト
GoってこんなコードGoってこんなコード
for _, sut := range []struct {
value string
description string
}{
{value: "1", description: "1です"},
{value: "2", description: "2です"},
{value: "3", description: "3です"},
} {
if !isNumeric(sut.value) {
t.Errorf("expected number , but actual %s. test case :%s", sut.value, sut.description)
}
}
ビャッと検証
(語彙力)
Goってこんなコード
・goルーチン(めっちゃ雑)
Goってこんなコード
func job() { // よくあるjob処理
fmt.Println("job Start...")
defer func() {
fmt.Println("job End...")
}()
}
Goってこんなコード
・goルーチン(めっちゃ雑)
Goってこんなコード
func main() {
go job() // goルーチン
// server起動処理など...
// ...
}
goルーチン使ってjobを実行させ
たりとかする
雑すぎてgoルーチン伝わるわけねえ!

Go Concurrency Patterns

でぜひググってください(再掲)

https://talks.golang.org/2012/concurrenc
y.slide#1



・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
・Goはクロスプラットフォーム(win,mac,linux)
・色んなOS向けにバイナリを吐ける
・GOOSオプションでOSを指定、GOARCHオプションでアーキテ
クチャを指定するだけでその環境向けの実行可能バイナリを生成
Goの特徴(クロスコンパイル)Goの特徴(クロスコンパイル)
package main
import "fmt"
func main() {
fmt.Printf("Hello worldn")
}
Goの特徴(クロスコンパイル)
・hello worldやっときましょうか
Goの特徴(クロスコンパイル)
・helloアプリケーションとかあるとすると、、
GOOS=linux GOARCH=amd64 go build hello.go
GOOS=darwin GOARCH=amd64 go build hello.go
GOOS=windows GOARCH=amd64 go build hello.go
これを各OSの人たちに配ればOK
Goの特徴(クロスコンパイル)Goの特徴(クロスコンパイル)
・GoにはGCがある
・トリコロールマーク&スイープGC
・なんですけど、まぁ本セッションでは割愛
・GoはC/C++的なレイヤーに近いように思いますが
GCあるのでメモリ管理は不要
Goの特徴(GC)Goの特徴(GC)
・GoにはGCがある
・トリコロールマーク&スイープGC
・なんですけど、まぁ本セッションでは割愛
・GoはC/C++的なレイヤーに近いように思いますが
GCあるのでメモリ管理は不要
Goの特徴(GC)Goの特徴(GC)
GCある!
Javaと一緒!
実質Java!
(出典:カロリーゼロ理論)
・Goは静的型付き
・Goには基本型と構造体がある
・ポインタもある
・interfaceもある
・速度速くて静的型がある、(僕は)嬉しい
Goの特徴(言語仕様)Goの特徴(言語仕様)
・Goは静的型付き
・Goには基本型と構造体がある
・ポインタもある
・interfaceもある
Goの特徴(言語仕様)Goの特徴(言語仕様)
基本型:
bool、string、int int8 int16 int32
int64、uint uint8 uint16 uint32
uint64、uintptr、byte、rune、
float32 float64、complex64
complex128
・Goは静的型付き
・Goには基本型と構造体がある
・ポインタもある
・interfaceもある
Goの特徴(言語仕様)Goの特徴(言語仕様)
構造体:
type Hoge struct {
a string
b int
}
・Goは静的型付き
・Goには基本型と構造体がある
・ポインタもある
・interfaceもある
Goの特徴(言語仕様)Goの特徴(言語仕様)
ポインタ:
var a *string
b := “b”
a = &b
・Goは静的型付き
・Goには基本型と構造体がある
・ポインタもある
Goの特徴(言語仕様)Goの特徴(言語仕様)
type Hoge interface {
Get() string
Set(string)
}
・フォーマットで争わなくて済む→gofmtです
・あと、未使用の変数やimportがあるとコンパイルエラーという優
しさ
・Javaもgoogle/google-java-formatとかかけておけば良いと思
うんです
Goの特徴(言語仕様)Goの特徴(言語仕様)
・サーバー/クライアントがある(net/httpパッケージ)
・jsonも扱える(encoding/jsonパッケージ)
・ユニットテスト(testingパッケージ)
・winでもちゃんと動くpath/filepathパッケージ
Goの特徴(言語仕様)Goの特徴(標準package)
・ライブラリの追加が簡単
go get hoge/fuga
Goの特徴(ライブラリ追加、依存管理)
githubとかに公開しておけば
go getとかすぐ出来る感じ
Goの特徴(コマンドライブラリ追加理)
・ライブラリの追加が簡単
go get hoge/fuga
Goの特徴(ライブラリ追加、依存管理)
CUIツールとか配布しやすい。peco
とか
Goの特徴(コマンドライブラリ追加理)
・誰が書いても同じようなコードになる(?)
・Goは本当に簡単か→それなりに難しい。平易に読みやすいが書
くのはまぁまぁ難しい
Goの特徴(Goは簡単か?という話)
読むには読めるけど、
サッと書くには慣れが必要
Goの特徴(Goは簡単か?という話)Goの特徴(誰が書いても同じコード?)
・メソッド名、変数名は略す
・小文字がprivate、大文字がpublic
・スコープはpackage単位、レシーバー単位
・レシーバーとなり得るのはpackageか構造体など
Goの特徴(Javaと違うとこ)Goの特徴(Javaと違うとこ)
・メソッド名、変数名は略す
・小文字がprivate、大文字がpublic
・スコープはpackage単位、レシーバー単位
・レシーバーとなり得るのはpackageか構造体など
Goの特徴(Javaと違うとこ)
大体go vetとかgolintが教えてくれ
るはず
Goの特徴(Javaと違うとこ)
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
・クラスが無いけどどうすりゃええの
→structとかにメソッドはやす
→ディレクトリ掘ってpackage作るファイル作る
(むやみに作るのはダメ、ゼッタイ。)
Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
・クラスが無いけどどうすりゃええの
→type定義やstructにメソッドはやす
→ディレクトリ掘ってpackage作るファイル作る
(むやみに作るのはダメ、ゼッタイ。)
Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
package構成に唯一解はないけど、宗
派はいくつかある
割とみんな悩みながらやってたり割り
切ってたりするらしい
・クラスが無いけどどうすりゃええの
→type定義やstructにメソッドはやす
→ディレクトリ掘ってpackage作るファイル作る
(むやみに作るのはダメ、ゼッタイ。)
Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
個人的には
自動生成系 + FW系 + 自前package
で考えながら育てていくのが
良いかなとか
・クラスが無いけどどうすりゃええの
→type定義やstructにメソッドはやす
→ディレクトリ掘ってpackage作るファイル作る
(むやみに作るのはダメ、ゼッタイ。)
Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
ばっきばきにレイヤードアーキテクチャ
とかそういうのやるなら多分Javaの方
がやりやすい
(Goで出来ないわけではないが…)
・ボイラープレートが増える?コード量が増える?
→冗長さはあるけど、結局書く人次第。
それ他の言語でも同じなのでは(自戒)
Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
ベンダリング
・go module一択になっていくと思われ
ビルド
・普通にgo runとかgo buildが良いと思われ
Goを使ってみる(ビルド、コーディング編)Go使いはじめ(ビルド、コーディング編)
・Javaで言うところのアレ、ある?
・そこに無かったらないですね
・ないものはない!Javaのことは忘れるんだ
※あるものはあります
Javaで言うとこのアレ、ある?Go使いはじめ(Javaで言うところのアレ、ある?)
・文字列操作 stringsパッケージ、substring的なもの = rune
・文字列←→数値 strconv, fmt.Sprint
・文字列フォーマット fmt
・ソート sortパッケージ
・ファイルの読み書き ioutilパッケージ
Javaで言うとこのアレ、ある?Go使いはじめ(Javaで言うところのアレ、ある?)
・Goやってて欲しくなる→強めのコレクションフレームワーク
(anyMatch, filter,map,flatMap,reduce,contains的なもの)
解決法:共通化したり、スニペットとかでガッと書く。
filter欲しいなぁ、、、って考えてる暇に書く。
これは慣れでなんとかなる。
Goやってて欲しくなるものGo使いはじめ(Goやってて欲しくなるもの)
・Goやってて欲しくなる→強めのコレクションフレームワーク
(anyMatch, filter,map,flatMap,reduce,contains的なもの)
解決法:またはgo generateを使う
gen: slice typewriter とか
https://clipperhouse.com/gen/slice/
Goやってて欲しくなるものGo使いはじめ(Goやってて欲しくなるもの)
・Goやってて若干欲しくなる→テスティングライブラリ
・Goとしては、あんまりテスティングライブラリとか使わず、標準の
ものだけ使ってシンプルなものに保てみたいな方針だった記憶
Goやってて欲しくなるものGo使いはじめ(Goやってて欲しくなるもの)
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
・Goでハマったとこ超初期→forのイディオム覚えられない
・for hoge := range hoges {...} とかやってしまう
Goを使ってハマった編Goを使ってハマった編
覚えるしかない!rangeで何が取得でき
るのか覚えるのに地味に苦労した
・循環依存
import cycle not allowed
Goを使ってハマった編Goを使ってハマった編
package Aでpackage Bをimport
package Bでpackage Aをimport
しちゃダメよ。
・Goでハマったとこ→slice作りすぎて爆死
むやみにループまわして無邪気にslice生成しまくると
メモリが足りなくなるよ。しょぼいサーバーとか
Goを使ってハマった編Goを使ってハマった編
・Goでハマったとこ→ログ吐いたらプロセス落ちるやん
・log.Fatalはos.Exitを呼んでいる
・カジュアルに使ってはいけない
・panicもカジュアルに使ってはいけない
Goを使ってハマった編Goを使ってハマった編
・GoだったらJavaだったら…という大きな違いは処理面で出にく
い。Goは並列処理は楽に安全にわりかし走らせやすい
・どこが問題になりやすいかといえば、結局外部サービス、DB、
IOなど。これはどの言語でもだと思う
Goを使ってハマった編Goを使ってハマった編
・イントロダクション(僕の思うGoとJava)
・Goことはじめ
・Goってこんなコード
・Goの特徴
・Go使いはじめ(yy_yank目線)
・Goを使ってハマった編(yy_yank目線)
・まとめ
アジェンダアジェンダ
・Goで手軽にマシンに優しいものが作れる
・Goに従えば手段が1つ増える
・アプリケーションを堅実に作れる
・並行処理も便利に使える
まとめまとめ
・Next Stepとなる更なる情報はgolang.tokyoやGo Conference
など
・あなた自身がgopherになることで手に入ります!
(丸投げ)
まとめまとめ
大事な手札を増やしていきましょう。

ありがとうございました。

これ以降のスライドは

時間の都合などで

発表ではカットしたものです

・go製の便利コマンド(個人的な好みによるリストアップ)
peco https://github.com/peco/peco
fzf https://github.com/junegunn/fzf
ghq https://github.com/motemen/ghq
docui https://github.com/skanehira/docui
ctop https://github.com/bcicen/ctop
lf https://github.com/gokcehan/lf
まとめボツネタ
・Go用ゲームライブラリ
https://github.com/hajimehoshi/ebiten
・GUI
https://github.com/avelino/awesome-go#gui
・Android/iOS開発はgo mobileで
https://github.com/golang/go/wiki/Mobile
・gopherjs
https://github.com/gopherjs/gopherjs
まとめボツネタ
・Goで作られているサービス
docker、k8s、istio、terraform、drone、prometheus などなどたくさん
http://namaristats.com/langs/Go
・Goは誰が使っている?
https://github.com/golang/go/wiki/GoUsers
(あ、弊社も使ってますよ!)
まとめボツネタ
・TUIライブラリまとめ
https://appliedgo.net/tui/
tviewとか結構いいらしいです
https://github.com/rivo/tview
まとめボツネタ
・GoのDIコンテナ
wireやdigがあるが、それほどリッチではなさそう
・ORMのベンチマーク
https://github.com/mattn/orm-benchmark
まとめボツネタ
・ORM
ORMのベンチマーク
https://github.com/mattn/orm-benchmark
awesome go ORM
https://github.com/avelino/awesome-go#orm
まとめボツネタ
・validator
go-playground/validator が流行ってる?
awesome-go validation
https://github.com/avelino/awesome-go#validation
まとめボツネタ
・ロガー
zap流行ってる?
zap https://github.com/uber-go/zap
awesome go logging
https://github.com/avelino/awesome-go#logging
まとめボツネタ
・test系ライブラリ
mock https://github.com/golang/mock
assertライブラリ https://github.com/stretchr/testify
カバレッジとってリッチな画面でみたいライブラリ
https://github.com/smartystreets/goconvey
awesome go testing https://github.com/avelino/awesome-go#testing
まとめボツネタ
・lint系やコーディング補助系ツール
errcheck(errチェック漏れ検知) https://github.com/kisielk/errcheck
fillstruct(struct生成) https://github.com/davidrjenni/reftools/cmd/fillstruct
goimports(自動import) https://godoc.org/golang.org/x/tools/cmd/goimports
gomodifytags(structタグ生成) https://github.com/fatih/gomodifytags
keyify https://github.com/dominikh/go-tools/tree/master/cmd/keyify
まとめボツネタ
・lint系やコーディング補助系ツール
iferrチェック https://github.com/koron/iferr
gocycro(循環複雑度チェック) https://github.com/fzipp/gocyclo
dupl(重複コードチェック) https://github.com/mibk/dupl
全部チェックしちゃうlinter https://github.com/golangci/golangci-lint
まとめボツネタ
・LSP(Language Server Protocol)
LSP仕様 https://github.com/Microsoft/language-server-protocol
gopls一択の状況(旧名golsp)。
gopls のuser guide https://github.com/golang/tools/blob/master/gopls/doc/user.md
goplsの他にbingoというのがあったが開発を止めてしまった…
https://github.com/saibing/bingo
gocodeも愛用されたがもう開発stop。。詳しくは
https://mattn.kaoriya.net/software/lang/go/20181217000056.htm
golang-serverも中身はgocodeらしいので…という話
まとめボツネタ
・エディタプラグイン(emacs)
go-mode https://github.com/dominikh/go-mode.el
go-eldoc https://github.com/syohex/emacs-go-eldoc
lsp-mode https://github.com/emacs-lsp/lsp-mode
まとめボツネタ
・エディタプラグイン(vim)
vim-go https://github.com/fatih/vim-go
gopher vim https://github.com/arp242/gopher.vim
vim-lsp https://github.com/prabirshrestha/vim-lsp
まとめボツネタ
・Goのレイヤー分割のしんどいところ
循環依存 import cycle not allowed
リッチなDIコンテナが無い
フレームワークとかがプロジェクトによってマチマチ(それは自然)。その中で統
一した構成は結構難しいかもしれないという
まとめボツネタ
・業務アプリケーションの package構成について(個人的感覚)
docker、k8s、istio、terraform、drone、prometheus などなどありますが
多分それをそのまま真似てもうまくいかない。
どういう方針でも自分たち考えて徐々に育てていくことが大事。
OSSのライブラリや SaaSとかIaaS的なものを作っている場合は真似しても良い気がするが、
実際自分たちが作っているのは何なのか …というところ。
レイヤー分割バリバリするようなホニャララアーキテクチャも結構 Goは向いていない。
(かといってそれを実践している人たちを批判したいわけでもない )。
自動生成は受け入れやすいので自動生成系とフレームワークのルールに従う。
ライブラリを掛け合わせて最適化していくのが良いのかなと思いますが、
誰かの言葉を借りてそれを答えだと思わないで欲しいのでこれも答えではありません。
まとめボツネタ
自分の知識不足による誤りなどあれば教
えていただけると幸いです。

適宜、資料修正します。



連絡先

twitter @yy_yank


More Related Content

PDF
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
PDF
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)
PPTX
PHP AST 徹底解説
PPTX
PHP と SAPI と ZendEngine3 と
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
RSA暗号運用でやってはいけない n のこと #ssmjp
PDF
Rpn and forth 超入門
PPTX
Pythonでキャッシュを活用する話①
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)
PHP AST 徹底解説
PHP と SAPI と ZendEngine3 と
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
RSA暗号運用でやってはいけない n のこと #ssmjp
Rpn and forth 超入門
Pythonでキャッシュを活用する話①

What's hot (20)

PDF
Linux : PSCI
PDF
JVMのGCアルゴリズムとチューニング
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
CTF for ビギナーズ バイナリ講習資料
PPTX
C#/.NETがやっていること 第二版
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
使ってみよう!JDK Flight Recorder
PDF
Javaのログ出力: 道具と考え方
PDF
Where狙いのキー、order by狙いのキー
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PPTX
JIRA / Confluence の 必須プラグインはこれだ
PPTX
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
PDF
Go入門
PDF
プログラムを高速化する話
PDF
プロセスとコンテキストスイッチ
PDF
Vivado hls勉強会1(基礎編)
PDF
JIT のコードを読んでみた
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
Linux : PSCI
JVMのGCアルゴリズムとチューニング
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
CTF for ビギナーズ バイナリ講習資料
C#/.NETがやっていること 第二版
ARM CPUにおけるSIMDを用いた高速計算入門
ヤフー社内でやってるMySQLチューニングセミナー大公開
使ってみよう!JDK Flight Recorder
Javaのログ出力: 道具と考え方
Where狙いのキー、order by狙いのキー
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
JIRA / Confluence の 必須プラグインはこれだ
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
Go入門
プログラムを高速化する話
プロセスとコンテキストスイッチ
Vivado hls勉強会1(基礎編)
JIT のコードを読んでみた
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
Ad

Similar to Javaプログラマのための頑張らないGo入門 (20)

PPTX
Go guide for Java programmer
PDF
JavaScript経験者のためのGo言語入門
PDF
初心者向けGo言語勉強会
PDF
Goの文法の実例と解説
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
PDF
マスターオブゴールーチンアンドチャネル スタートGo #1
PDF
GoによるiOSアプリの開発
PPTX
ゆるふわGo言語
PDF
TechDo Goハンズオン#3
PDF
エキスパートGo
PDF
Goでかんたんソースコードの静的解析
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
PDF
Golang入門
PDF
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
PPTX
関数型言語&形式的手法セミナー(3)
PDF
今日から始める Go言語 と appengine
PDF
ちょっとだけさわってみる Go言語
PDF
Go言語と過ごした一週間
PDF
Goを知る
PDF
ちょっとさわってみるGo言語ハンズオン
Go guide for Java programmer
JavaScript経験者のためのGo言語入門
初心者向けGo言語勉強会
Goの文法の実例と解説
今日から始めるGopher - スタートGo #0 @GDG名古屋
マスターオブゴールーチンアンドチャネル スタートGo #1
GoによるiOSアプリの開発
ゆるふわGo言語
TechDo Goハンズオン#3
エキスパートGo
Goでかんたんソースコードの静的解析
メルカリ・ソウゾウでは どうGoを活用しているのか?
Golang入門
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
関数型言語&形式的手法セミナー(3)
今日から始める Go言語 と appengine
ちょっとだけさわってみる Go言語
Go言語と過ごした一週間
Goを知る
ちょっとさわってみるGo言語ハンズオン
Ad

More from yy yank (12)

PDF
VMの歩む道。 Dalvik、ART、そしてJava VM
PDF
Jvm言語とJava、切っても切れないその関係
PDF
Kotlinソースコード探訪
PDF
Javaで最強のfizz buzz
PDF
KuromojiをKotlinで動かす
PDF
Doma2 with Kotlin
PDF
絶対にぬるぽを出さない
PDF
Kotlinこんなん出ましたけど
PDF
Kotlinあるある言いたい
PDF
【こっそり始める】Javaプログラマコーディングマイグレーション
PDF
Kotlinメジャーver リリースを前に
PPTX
Server Side Kotlin
VMの歩む道。 Dalvik、ART、そしてJava VM
Jvm言語とJava、切っても切れないその関係
Kotlinソースコード探訪
Javaで最強のfizz buzz
KuromojiをKotlinで動かす
Doma2 with Kotlin
絶対にぬるぽを出さない
Kotlinこんなん出ましたけど
Kotlinあるある言いたい
【こっそり始める】Javaプログラマコーディングマイグレーション
Kotlinメジャーver リリースを前に
Server Side Kotlin

Javaプログラマのための頑張らないGo入門