Slide 1

Slide 1 text

Java開発者の Goプロジェクト1年の振り返り

Slide 2

Slide 2 text

林 賛昊(イム チャノ)
 サーバー/ポケコロツイン開発リーダー
 職務経歴
 ・NHN Japan株式会社(現Line) 
 ・cocone株式会社 
 ・NC Japan株式会社 
 趣味
 Outdoor系(キャンプ、登山、運動) 
 社内でストラックアウトができた! 
 blackpink


Slide 3

Slide 3 text

目次
 3 ● Go? プロジェクトアサイン
 ● Goという壁
 ● GoとJavaの差
 ● Goと仲良く慣れるまでの道のり
 ● まだなれないGoのところ
 ● GoでGo!Go!Go!


Slide 4

Slide 4 text

開発言語経歴(ほとんどがJava開発)
 4 .Ne PHP C# Python No de. js AS Obje ctive C Andr oid Uni...

Slide 5

Slide 5 text

Go? プロジェクトアサイン
 5 CTO Kさん ME 新規プロジェクトがリリース直 近ですが、開発が足りないの でお願いします。 できますね? アハハハハハ ^_____^

Slide 6

Slide 6 text

Deep Impact!
 6 GO Java人生からいきなりGo? 生き残るのを祈ります。。

Slide 7

Slide 7 text

救いの手
 7 ● 実は抗体があった
 ○ 社内Go勉強会参加
 ○ 少し触ってみた
 ● 開発中のプロジェクトのため、サポートがあった
 ● リリースまで1ヶ月残っていた
 ○ CMS作成でトレーニングを始めた


Slide 8

Slide 8 text

Goの特徴
 8 ● 早い
 ○ コンパイル、起動が秒速!!
 ○ 処理スピード(Go:機械語、Javaはバイトコード)
 ● メモリ管理をGoで行う
 ● モジュールだけで動く
 ● goroutine軽量スレッド処理(channel)
 ● シンプルで使いやすい


Slide 9

Slide 9 text

Goという壁 - ポインター型、バリュー型
 9 ● ポインター型
 ○ ポインターで参照する
 ○ *StructA, []*StructB
 ○ structA := &StructA{}
 ● バリュー型
 ○ 値をコピーして参照する
 ○ StructA、[]StructB
 ○ structA := StructA{}
 ● Map / Sliceはポインター型のみ


Slide 10

Slide 10 text

Goという壁 - タイプの厳格さ
 10 ● タイプの厳格さ
 ○ int / int8 / int16/ int32 / Int64, (uintprt)
 ※int : OSやCPUなどの実装系に依存した


Slide 11

Slide 11 text

Goという壁 - nil
 11 ● nil (javaのnullに該当する)
 ● Goのnil:型を持つ
 ← 結果はfalse

Slide 12

Slide 12 text

Goという壁 - panic
 12 ● JavaのExceptionに該当
 ● panicを処理しないとプロセスが終了する
 ○ APが死亡することもあった
 ● defer{
 recover{}
 }でハンドリングできる
 ○ java : try ~ catch ~ finally


Slide 13

Slide 13 text

error
 13 ● errorは処理の結果によるもの
 ● functionのreturnで異常終了をお知らせる
 ○ func testFunction() (int32, error) {}
 ● errorは処理しなくてもいい
 ○ rVal1, _ := testFunction()
 


Slide 14

Slide 14 text

GoとJavaの差 - interface / interface{}
 14 ● interface / interface{}
 ○ inteface
 ■ Go, Java : 概念
 ○ interface{}
 ■ Java:interface型はない。Objectに近い
 ● Object → super class
 ■ Go:型(Data Type)
 ● interface{} → 他のデータタイプと無関係
 ● 全てのデータタイプが入れる


Slide 15

Slide 15 text

GoとJavaの差 - その他
 15 ● multiple return value
 ○ Goで一番嬉しい機能
 ● package
 ○ Goはクラスの概念がないため、package単位になる
 ● 使わない変数・importはコンパイルエラーになる


Slide 16

Slide 16 text

Goと仲良く慣れる近道
 16 ● Javaの習性を捨てる
 ○ GoはObject指向の言語ではない(公式な言及はない)
 ● 真似する
 ○ Goのコードを読む、同じく実装する
 ● CodeStyle Checkerを活用する
 ○ checkstyleを利用中


Slide 17

Slide 17 text

まだなれないGoのところ
 
 17 ● 暗黙的な処理(型推論)
 ○ param := 100 -> var param int = 100
 ○ var sliceParam []string -> nil だが初期化される
 ● primitive typeのアドレス参照
 ○ count := 100 abc := &count
 ● 関数型変数
 ○ func sampleFunction(paramFunc valFunc() rtn)
 


Slide 18

Slide 18 text

Javaが恋しくなるところ
 18 ● Genericsが使えない
 ● 高度な抽象化が難しい
 ● interface型のConvert
 ○ タイプチェックから変換が必要
 ○ 何が入っているかわかってるからやってくれ
 
 


Slide 19

Slide 19 text

GoでGo!Go!Go!
 19 ● 軽い、早い
 ○ 本番モジュール:10Mb程度
 ● 本番はGoモジュールだけで完結
 ○ 環境構築がいらない
 ● 学習しやすい
 ● Google様( 個人の感想です )が開発してる!!
 


Slide 20

Slide 20 text

ポケコロツイン
 20 技術スタック
 Server Go Client Unity (C#) 通信 gRPC データタイプ protocol buffer

Slide 21

Slide 21 text

Q&A / Tips
 21 ● https://play.golang.org/ (web codingツール)
 ● https://golang.org/ref/spec(blog)
 ○ https://www.ymotongpoo.com/works/goblog-ja
 ● https://github.com/avelino/awesome-go(library)
 ● IDE
 ○ Intellij-go plugin, vscode, Go Land, Atom


Slide 22

Slide 22 text

ご清聴ありがとうございます
 22