あぼぼーぼ・ぼーぼぼ

のんびり生きたい

iOS(Swift)エンジニアがGoでAPI作って感じたこと

普段Swiftを使ってiOSアプリを開発している私が、GoでAPIを開発した際に感じたことを紹介します。

列挙型(Enum)がない!

SwiftではEnumをめちゃめちゃ使います。ですがGoにはありません。が、Goではtypeを用いて擬似的にEnumっぽいことを実現できるようです。

Swift

enum Edge: Int {
    case top, bottom, leading, trailing
}

Go

type Edge int

const (
    Top Edge = iota
    Bottom
    Leading
    Trailing
)

interfaceを実装することでEdgeを拡張することができます。たとえばStringerインタフェースを実装すると、文字列での出力ができるようになります。

type Edge int

const (
    Top Edge = iota
    Bottom
    Leading
    Trailing
)

func (c Edge) String() string {
    switch c {
    case Top: return "上端"
    case Bottom: return "下端"
    case Leading: return "左端"
    case Trailing: return "右端"
    default: return "Unknown"
    }
}

Swiftエンジニアからするとちょっと違和感がありますね。そうです、ケースを網羅していてもdefault節は必要です。enumではないですからね。

ただinterfaceを実装することでEdgeをどんどん拡張していくことができるので、自由度は高いです。

ついにポインタを学ぶときがきたか...

Swiftにも、UnsafePointerなどのポインタを扱えるAPIがあるのですが、業務や趣味含めて一度も触ることはなかったため、業務としてはGo言語で初めて触れることになりました。正直今も100%理解できている自信はないです。

SwiftエンジニアにおけるGo言語へのハードルを低くする目的で書きますが、ポインタの使い方のひとつとして、SwiftでいうOptional型のような使い方があると思ってみるといいのではないかと思います(あまり真に受けられると困るのですが)。私は最初そう思うことで、自分なりにGo言語に対するハードルを下げていました。

SwiftのOptional型のような、というのはつまりnilを使いたいときにポインタ型を使うということです。たとえばAPIレスポンスのjson定義とか、DBのカラムの定義とかです。

type User struct {
    ID int `json:"user_id"`
    Name string `json:"user_name"`
    Age *int `json:"user_age,omitempty"`
}

これでuser_ageがnullじゃなければAgeをjsonに含めるということができるようになったりします。

そのほか、例えば構造体は値型ですので関数に渡すときなどコピーが生成されますが、ポインタを渡すことで元の構造体を参照できます。

type Position struct {
    X float64
    Y float64
}

func Exchange(p *Position) {
    x, y := p.X, p.Y
    p.X = y
    p.Y = x
}

ただポインタはやはり重要な概念だと思いますので、Goと仲良くなってきたらしっかり腰を据えて学びましょう。 Pointers — An Introduction to Programming in Go | Go Resources

これ使っとけばOKなフレームワークがない

iOS開発でいうところのCocoa Touch(UIKit)に相当するようなものがないという認識です。私は業務でAPIを作りましたが、そのときは社内で一番採用実績があること、ミニマムであること、ドキュメントドリブンなところなどに惹かれgoaを採用しました。

github.com

ほかにもたくさんあるみたいなので興味があればご覧になってみてください。7 Frameworks To Build A REST API In Go | Nordic APIs |

ただこれは躓いたというよりは当たり前のことで、「選択肢の中からメリット/デメリットなど特徴を理解したうえでそのとき最適なものを選ぶ」という、課題解決においては普通のことが必要になるということでした。

ビルドはやい

※2018/12/19思いついたので追記

SwiftでのiOSアプリ開発に比べるとビルドが早いです。

コード書いてビルドして確認(orテスト)の一連のスピード感が速まるとテンポよく開発できます。

iOSアプリではビルドを待ってる間に仮眠したりトイレに行ったりできますので、それもそれで嫌いじゃなかったんですが、やっぱテンポ良く開発できると気持ちがいいもんです。

エラーハンドリングでゲシュタルト崩壊

if err != nilif err == nilゲシュタルト崩壊を起こしました。今自分がどちらを書こうとしているのかわからなくなります。

if err != nil {
    // 異常系処理
}

if err == nil {
    // 正常系処理
}

Swiftのエラーハンドリングに慣れていると最初のうちはゲシュタルト崩壊を体験するかもしれませんが、大丈夫ですそのうち慣れます。

Gopherくんが可愛い

iOS開発には存在しない、Go言語公式のマスコットキャラです。仕事で疲れた心を癒してくれました。

https://raw.githubusercontent.com/egonelbre/gophers/master/.thumb/animation/gopher-dance-long-3x.gif

github.com

おわりに

最初のうちは、Swiftの慣れからくるGo言語への抵抗感がありましたが、今はそうでもないです。

むしろGopherくん可愛いし、やっぱり自分の中に新たな知識が流れ込んでくるのは新鮮ですね。

これからもGoと仲良くしてまいります。