Go APIの実装をしたのでそのときのメモを残しておく

Programming

バイナリーテキストを型変換する(参照渡しで)

GoはGenericsがないので返却値に不明の型を指定することはできません。

なので参照渡しで型を作成しておいて、メソッドの中で変換します。(返せるのはinterface{}のみ

変換失敗した場合はエラーが帰ります。

import (
	"github.com/mitchellh/mapstructure"
	"github.com/tidwall/gjson"
	"os"
	"strings"
)

func mapStringsStruct(strs []string, st interface{}) error {
	str := "[" + strings.Join(strs, ", ") + "]"
	return mapJsonStruct([]byte(str), &st)
}

func mapStringStruct(str string, st interface{}) error {
	return mapJsonStruct([]byte(str), &st)
}

func mapJsonStruct(byts []byte, st interface{}) error {
	tmp := gjson.ParseBytes(byts).Value().(interface{})
	config := &mapstructure.DecoderConfig{
		TagName:  "json",
		Result:   st,
		Metadata: nil,
	}
	decoder, err := mapstructure.NewDecoder(config)
	if err != nil {
		return err
	}
	return decoder.Decode(tmp)
}

GoでのDockerfileの作り方

Goでは実行バイナリファイルをgo build -o hogefile で簡単に作成できるのでマルチステージビルドで作成して次のステップに渡すのがおすすめです。

  1. (例では) OpenAPI のビルドをしてGoの自動生成ファイルを作成
  2. 自動生成されたGoのファイルを渡し、go buildしバイナリファイルを渡す
  3. バイナリファイルを軽いalpineLinuxイメージに乗せて実行コマンドを設定する
# OpenAPIでのGenerateが必要な場合、不要であれば省いてOK
FROM openapitools/openapi-generator-cli AS openapi
ADD . /app
WORKDIR /app
RUN generate -i /api.openapi.yaml -g go -o .

FROM golang:1.14 AS build
WORKDIR /go/src
COPY --from=openapi /app /go/src
# OpenAPI Generateがなければ以下を使用する
# COPY . /go/src
RUN CGO_ENABLED=0 go build -o server

FROM alpine:3.12.0 AS runtime
WORKDIR /api
COPY --from=build /go/src /api
EXPOSE 8080/tcp
ENTRYPOINT ["./server"]

Dockerfile確認用 dockerコマンド

適当なgoの確認用ファイルを作る

package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}

dockerコマンドで確認する

docker build -t go-docker-test:latest .
docker container run -it go-docker-test:latest

hello worldが表示されたら成功です。

閲覧いただきありがとうございます。お疲れ様でした!

#Go#OpenAPI#docker#実装メモ

Related Links


dockerのイメージをLatestにしたらあかん
docker Redisでping PONG
Yoshiki Ohashi
2x歳の個人事業主エンジニア。SI企業1年, Webベンチャー企業2年で上流から下流の経験を経て独立。 エンジニアらしく性格は温和。プロジェクトチームに心理的安全性を求める。go gin | Spring | Java | Kotlin | Vue | Python | 筋トレ | キャンプ | 個人開発 | 新潟出身

よく読まれている記事


Gatsbyでブログを始めるまで
GatsbyにShare機能、OGPタグをつける
Gatsbyにタグ機能、カテゴリ機能をつける(基礎編)
DL実装するときに理解すること
多機能なGatsbyJSのThemeをつくってnpmに公開した話
© 2020 Yoshiki Ohashi All rights reserved.