社内LTにて、Goを布教しようと試みましたʕ◔ϖ◔ʔ
Goに入門しよう株式会社ユニクエスト長谷川広樹github.com/hiroki-it@Hiroki__IT
View Slide
自己紹介▼ お仕事最近:クラウドインフラ、IaC、CICD、...以前:DDD▼ 関心のある技術領域・クラウドインフラ・IaC・DDDgithub.com/hiroki-it@Hiroki__IT長谷川 広樹 (はせがわ ひろき)株式会社ユニクエスト
目次■ Goの概要■ Goの基本文法■ Goのよいところ■ Goへの批判 ※悪いところではない
Goの概要(1)■ 静的型付け言語・ソースコードの実行前にビルドの作業が必要・ビルドの成果物 = アーティファクトhttps://www.atmarkit.co.jp/ait/articles/1105/23/news128.html
Goの概要(2)■ 言語としての種類・手続き型言語・クラスや継承の機能がない(※後述)第9回UMTPモデリング技術ワークショップhttps://umtp-japan.org/
Goの基本文法(1)package // 名前空間の宣言import "" // パッケージの読み込みfunc Xxx(x string) string { // 関数}・一つのディレクトリ内では一つのパッケージ名のみ.・関数名は,頭文字が大文字だとパブリック,小文字だとプライベートになる.・引数と返却値に型付けが必要.
Goの基本文法(2)■ エントリポイント・処理開始地点になるプログラム・PHPでいうindex.php■ Goのエントリポイント・mainパッケージ・インポートパッケージ・main関数// エントリーポイント// パッケージ名package main// インポートパッケージimport "fmt"// 関数func main() {fmt.Printf("%#v\n", "Hello world!")}
Goの基本文法(3)■ 構造体・クラスのようなもの・データのみを保持・頭文字の大小で パブリック/プライベートを制御■ 構造体と関数の関連付け・構造体に関数を持たせる・構造体から関数をコールできる (メソッド化)・継承の廃止については後述// 構造体type Name struct {FirstName stringLastName string}// コンストラクタfunc NewName(firstName string, lastName string) *Name {return &Name{FirstName: firstName,LastName: lastName,}}// フルネームを返却するメソッドを関連付けるfunc (name *Name) fullName() string {return fmt.Sprintf("%s %s", name.FirstName, name.LastName)}
一旦,ここまでで何かあれば...
Goのよいところ(1)※個人的には一番面白い■ マルチスレッド下の並列処理・処理を同時に開始・関数でGoルーチンを宣言・シングルスレッド下の非同期処理とは異なる・非同期処理と同様に完了を待機する実装が必要■ 使いどころ・反復処理で一つの関数を複数回コール・互いに独立した計算処理・互いに独立したAPIリクエスト処理package mainfunc hoge() {// 何らかの処理}func fuga() {// 何らかの処理}func main() {go hoge() // 同時実行go fuga() // 同時実行}サンプル:https://play.golang.org/p/4XdtMRsgu5t
Goのよいところ(2)■ 型付けの厳格さ・定義に必ず型付けが必要・型定義しないとエラーになる・開発時にバグを潰せる■ 型推論・変数定義に『:=』を使い,型を推論・型定義なしに静的型付けのメリットを享受package mainimport "fmt"func quotient(x int, y int) int {// 商を計算する.quotient := x / y// 商を返却する.return quotient}func main() {fmt.Println(quotient(2, 2))}サンプル:https://play.golang.org/p/1Vw-zsJKlYh
Goのよいところ(3)■ バグを生まないようにするコマンド達・go fmt: ソースコードを自動整形.・go vet: バグではないが,問題が起こりそうな実装方法を指摘・go test: xxx_test.goファイルの『TestXxx()』をテストするサンプル:https://play.golang.org/p/omHow7_lOs9
Goのよいところ(4)言語名 1回目 2回目 3回目 Go 541.38秒 546.18秒 543.36秒 C言語 563.23秒 563.32秒 561.96秒 Java 543.91秒 543.08秒 541.13秒 Python 18時間程度 18時間程度 18時間程度 ihttps://github.com/meideru/PrimeSpeedTest■ コンパイルが速い・他の静的型付けや動的型付けよりもコンパイルが速い・Javaは中間言語に一度変換する必要があるが,Goでは直接機械語に翻訳可能指定した数値範囲内の素数を出力するプログラムでのコンパイル速度検証
Goのよいところ(5)■ ほどよくシンプル・黒魔術的な関数やライブラリがない一方で,基本的な機能は揃っている・フレームワークは使わないことがデファクトスタンダード・少々コード量が増えたとしても,黒魔術より基本的機能の組み合わせを優先・可読性が高く,後続者が開発しやすい■ PHPは便利なものがたくさん一方で,難解な実装になりがち・強力過ぎるフレームワークやライブラリたち・array_xxxxx 関数・高階関数
Goのよいところ(6)func Division(x int, y int) (int, int) {// 商を計算する.quotient := x / y// 余りを計算する.remainder := x % y// 商と余りを返却する.return quotient, remainder}■ 複数の返却値・複数の値をシンプルに返却可能.・並列処理を組み合わせると可能性∞
Goへの批判(1-1)※悪いところではない■ クラスや継承の機能がない・クラスの継承には問題点があり,『継承はカプセル化を壊す』で検索・思想として,クラスや継承を廃止した・継承よりも『委譲』の方が優れている■ 代わりに委譲を使わせる思想・処理の一部/全てを他クラスに託す方法・PHPでは,Interfaceの実装などで実現可能・Goでは,『埋め込み』で実現
Goへの批判(1-2)※悪いところではない// Nameから処理を委譲されたtype MyName struct {*Name}// コンストラクタfunc NewMyName(name *Name) *MyName {return &MyName{Name: name,}}type Name struct {FirstName stringLastName string}func NewName(firstName string, lastName string) *Name {return &Name{FirstName: firstName,LastName: lastName,}}// フルネームを返却func (name *Name) fullName() string {return fmt.Sprintf("%s %s", name.FirstName,name.LastName)}埋め込む側(委譲元) 埋め込まれる側(委譲先)
Goへの批判(1-3)※悪いところではないfunc main() {// 埋め込む側の構造体の初期化name := NewName("Hiroki", "Hasegawa")// コンストラクタインジェクションmyName := NewMyName(name)// Name構造体のメソッドをコールできる.fmt.Printf("%#v\n", myName.fullName()) // "Hiroki Hasegawa"}・埋め込んだ側の構造体が,埋め込まれた構造体にメソッドを託す・MyName構造体はfullNameメソッドを使用できる
他にも批判はいくつかあるが割愛...
最後にGopherくん超かわいい!!!by Takuya Ueda (https://twitter.com/tenntenn)The Gopher character is based on the Go mascot designed by Renée French.