Upgrade to Pro — share decks privately, control downloads, hide ads and more …

🐭 Goに入門しよう

🐭 Goに入門しよう

社内LTにて、Goを布教しようと試みましたʕ◔ϖ◔ʔ

More Decks by Hiroki Hasegawa (長谷川広樹)

Other Decks in Programming

Transcript

  1. Goに入門しよう
    株式会社ユニクエスト
    長谷川広樹
    github.com/hiroki-it
    @Hiroki__IT

    View Slide

  2. 自己紹介
    ▼ お仕事
    最近:クラウドインフラ、IaC、CICD、...
    以前:DDD
    ▼ 関心のある技術領域
    ・クラウドインフラ
    ・IaC
    ・DDD
    github.com/hiroki-it
    @Hiroki__IT
    長谷川 広樹 (はせがわ ひろき)
    株式会社ユニクエスト

    View Slide

  3. 目次
    ■ Goの概要
    ■ Goの基本文法
    ■ Goのよいところ
    ■ Goへの批判 ※悪いところではない

    View Slide

  4. Goの概要(1)
    ■ 静的型付け言語
    ・ソースコードの実行前にビルドの作業が必要
    ・ビルドの成果物 = アーティファクト
    https://www.atmarkit.co.jp/ait/articles/1105/23/news128.html

    View Slide

  5. Goの概要(2)
    ■ 言語としての種類
    ・手続き型言語
    ・クラスや継承の機能がない(※後述)
    第9回
    UMTPモデリング技術
    ワークショップ
    https://umtp-japan.org/

    View Slide

  6. Goの基本文法(1)
    package // 名前空間の宣言
    import "" // パッケージの読み込み
    func Xxx(x string) string { // 関数
    }
    ・一つのディレクトリ内では一つのパッケージ名のみ.
    ・関数名は,頭文字が大文字だとパブリック,小文字だとプライベートになる.
    ・引数と返却値に型付けが必要.

    View Slide

  7. Goの基本文法(2)
    ■ エントリポイント
    ・処理開始地点になるプログラム
    ・PHPでいうindex.php
    ■ Goのエントリポイント
    ・mainパッケージ
    ・インポートパッケージ
    ・main関数
    // エントリーポイント
    // パッケージ名
    package main
    // インポートパッケージ
    import "fmt"
    // 関数
    func main() {
    fmt.Printf("%#v\n", "Hello world!")
    }

    View Slide

  8. Goの基本文法(3)
    ■ 構造体
    ・クラスのようなもの
    ・データのみを保持
    ・頭文字の大小で
     パブリック/プライベートを制御
    ■ 構造体と関数の関連付け
    ・構造体に関数を持たせる
    ・構造体から関数をコールできる
     (メソッド化)
    ・継承の廃止については後述
    // 構造体
    type Name struct {
    FirstName string
    LastName 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)
    }

    View Slide

  9. 一旦,ここまでで何かあれば...

    View Slide

  10. Goのよいところ(1)※個人的には一番面白い
    ■ マルチスレッド下の並列処理
    ・処理を同時に開始
    ・関数でGoルーチンを宣言
    ・シングルスレッド下の非同期処理とは異なる
    ・非同期処理と同様に完了を待機する実装が必要
    ■ 使いどころ
    ・反復処理で一つの関数を複数回コール
    ・互いに独立した計算処理
    ・互いに独立したAPIリクエスト処理
    package main
    func hoge() {
    // 何らかの処理
    }
    func fuga() {
    // 何らかの処理
    }
    func main() {
    go hoge() // 同時実行
    go fuga() // 同時実行
    }
    サンプル:
    https://play.golang.org/p/4XdtMRsgu5t

    View Slide

  11. Goのよいところ(2)
    ■ 型付けの厳格さ
    ・定義に必ず型付けが必要
    ・型定義しないとエラーになる
    ・開発時にバグを潰せる
    ■ 型推論
    ・変数定義に『:=』を使い,型を推論
    ・型定義なしに静的型付けのメリットを享受
    package main
    import "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

    View Slide

  12. Goのよいところ(3)
    ■ バグを生まないようにするコマンド達
    ・go fmt:
     ソースコードを自動整形.
    ・go vet:
     バグではないが,問題が起こりそうな実装方法を指摘
    ・go test:
     xxx_test.goファイルの『TestXxx()』をテストする
    サンプル:
    https://play.golang.org/p/omHow7_lOs9

    View Slide

  13. 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では直接機械語に翻訳可能
    指定した数値範囲内の素数を出力するプログラムでのコンパイル速度検証

    View Slide

  14. Goのよいところ(5)
    ■ ほどよくシンプル
    ・黒魔術的な関数やライブラリがない一方で,基本的な機能は揃っている
    ・フレームワークは使わないことがデファクトスタンダード
    ・少々コード量が増えたとしても,黒魔術より基本的機能の組み合わせを優先
    ・可読性が高く,後続者が開発しやすい
    ■ PHPは便利なものがたくさん一方で,難解な実装になりがち
    ・強力過ぎるフレームワークやライブラリたち
    ・array_xxxxx 関数
    ・高階関数

    View Slide

  15. Goのよいところ(6)
    func Division(x int, y int) (int, int) {
    // 商を計算する.
    quotient := x / y
    // 余りを計算する.
    remainder := x % y
    // 商と余りを返却する.
    return quotient, remainder
    }
    ■ 複数の返却値
    ・複数の値をシンプルに返却可能.
    ・並列処理を組み合わせると可能性∞

    View Slide

  16. Goへの批判(1-1)※悪いところではない
    ■ クラスや継承の機能がない
    ・クラスの継承には問題点があり,『継承はカプセル化を壊す』で検索
    ・思想として,クラスや継承を廃止した
    ・継承よりも『委譲』の方が優れている
    ■ 代わりに委譲を使わせる思想
    ・処理の一部/全てを他クラスに託す方法
    ・PHPでは,Interfaceの実装などで実現可能
    ・Goでは,『埋め込み』で実現

    View Slide

  17. Goへの批判(1-2)※悪いところではない
    // Nameから処理を委譲された
    type MyName struct {
    *Name
    }
    // コンストラクタ
    func NewMyName(name *Name) *MyName {
    return &MyName{
    Name: name,
    }
    }
    type Name struct {
    FirstName string
    LastName 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)
    }
    埋め込む側(委譲元) 埋め込まれる側(委譲先)

    View Slide

  18. Goへの批判(1-3)※悪いところではない
    func main() {
    // 埋め込む側の構造体の初期化
    name := NewName("Hiroki", "Hasegawa")
    // コンストラクタインジェクション
    myName := NewMyName(name)
    // Name構造体のメソッドをコールできる.
    fmt.Printf("%#v\n", myName.fullName()) // "Hiroki Hasegawa"
    }
    ・埋め込んだ側の構造体が,埋め込まれた構造体にメソッドを託す
    ・MyName構造体はfullNameメソッドを使用できる

    View Slide

  19. 他にも批判はいくつかあるが割愛...

    View Slide

  20. 最後に
    Gopherくん
    超かわいい!!!
    by Takuya Ueda (https://twitter.com/tenntenn)
    The Gopher character is based on the Go mascot designed by Renée French.

    View Slide