golang

package is not in GOROOT

2021-03-02
golang

一時的にGOPATHを変更してから、パッケージを2個作ったうえで簡単なコードを実行した時、次のようなエラーが出ました。 % package other/pkg1 is not in GOROOT (/usr/local/go/src/other/pkg1) パッケージの構造が原因です ...

Google Cloudのサービスアカウントキーファイルを環境変数に設定する

2021-01-19
gcp, golang

Google Translation APIのガイドでは、Advanced Editionを使用する場合、サービスアカウントのキーファイルを使用するように案内されております。しかし、認証情報をスト ...

AWS SDK for Goを使ったユニットテスト

2020-11-27
aws, golang

AWS SDK for Goの各AWSサービスのユニットテストのコードです。 単純にラップするするstructを作ってテストしています。 例えば、DynamoDBの場合は次の通り。 実 ...

SlackのEventAPIのリトライコールを防ぐ - golang

2020-10-23
golang, API, slack

エラーレスポンスを返す時でもリトライさせたくない場合は、ヘッダにX-Slack-No-Retryを指定する。 func handler(w http.ResponseWriter, r *http.Request) { // Process something... // Set "X-Slack-No-Retry: 1" if prevent retry. w.Header().Set("X-Slack-No-Retry", "1") w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) w.Write([]byte("")) } Reference https://api.slack.com/events-api#the-events-api__field-guide__error-handling__graceful-retries__turning-retries-off

generate gomockでエラーが出た - golang

2020-10-21
golang, tips

gomockでエラー。とりあえず古いファイルを消して再実行すると解消できた。 % mockgen -source ./internal/app/usecase/xxx/repository.go -destination ./internal/app/usecase/xxx/repository_mock.go -package xxx -: found packages xxx (repository.go) and mock_updateproteinevent (repository_mock.go) in /Users/xxx/go/src/proteinreminder/internal/app/usecase/xxx 2020/10/21 04:21:56 Loading input failed: loading package failed # Delete % rm -rf ./internal/app/usecase/xxx/repository_mock.go # Run again and completed. % mockgen -source ./internal/app/usecase/xxx/repository.go -destination ...

API Gateway + Lambda - golang

2020-07-05
golang, aws

APIGateway + GoでLambdaのサンプルです。 仕様 エンドポイント: https://<API ID>.execute-api.ap-northeast-1.amazonaws.com/<stage>/<Resource> HTTPメソッド: GET パラメータ: { "text": "string" } Lambdaハンドラ 引数をstructで定義。 package main import ( "context" "github.com/aws/aws-lambda-go/lambda" ...

安全なtruncate string - golang

2020-06-28
golang

package main import ( "fmt" ) // Truncate string. func TruncateString(str string, length int) string { if length <= 0 { return "" } // This code cannot support Japanese // orgLen := len(str) // if orgLen <= length { // return str // } // return str[:length] // Support Japanese // Ref: Range loops https://blog.golang.org/strings truncated := "" count := 0 for _, char := range str { truncated += string(char) count++ if count >= length { break } ...

"omitempty"のメモ - golang

2020-06-25
golang

json.Marshal はomitemptyが値型stringに設定されていれば空文字を出力する。 フィールド自体不要な場合は、ポインタ型stringにするといい。 package main import ( "encoding/json" "fmt" ) type ValueSlice struct ...

ParseFormした値をstructに設定 - golang

2020-06-23
golang

// Set FormValues to struct func SetFormValueToStruct(values url.Values, structPtr interface{}) error { // Get the pointer of struct ptr := reflect.ValueOf(structPtr) // Get the value of struct value := ptr.Elem() // Set value to struct field valueType := value.Type() for i := 0; i < value.NumField(); i++ { jsonTag := valueType.Field(i).Tag.Get("json") if value.Field(i).CanSet() == false { return errors.New("cannot set value to field") } value.Field(i).Set(reflect.ValueOf(values.Get(jsonTag))) } return nil } // Example func ExampleSetFormValueToStruct() { // Form values formValues := url.Values{} formValues.Set("test1", ...

ユニコードキャラクタをエスケープシーケンスに変換 - golang

2020-06-12
golang

json.Unmarshalしたデータに含まれる文字列のユニコードキャラクタをエスケープシーケンスに変換します。 // func convertJsonElement(data interface{}) interface{} { switch v := data.(type) { case map[string]interface{}: for ik, iv := range v { v[ik] = convertJsonElement(iv) } ...

パッケージ名で悩む - golang

2020-06-07
golang, design

プロジェクト内で、HTTPのユーティリティ関数をまとめるモジュールの命名に悩んでいました。 結果は project-layoutの構成で、internalの下にht ...

panicのテスト - golang

2020-05-28
golang, test

Goでパニックが発生するかどうかのテストです。 // Testing if testFunc calls panic. // e.g. // IsTestCallPanic(func(){ // <place test target here.> // }) func IsTestCallPanic(testFunc func()) (ok bool) { defer func() { if err := recover(); err == nil { ok = false } }() ok = true testFunc() return } // Test for test. func TestIsTestCallPanic(t *testing.T) { isCalled := IsTestCallPanic(func() { ...

Interfaceポインタの型エラー - golang

2020-04-13
golang

Iocコンテナを作ろうとして次のようなコードを書くとエラーが出ました。 原因はinterfaceのポインタの型エラー。 // interface type IFace interface { hello() string } // concrete type type Concrete struct { } func NewConcrete() *Concrete { return ...

error table [name] has no column [column]

2020-01-31
golang, sqlite

GoでsqliteにデータをInsertしようとしてエラー。 $ error table Balance has no column named price Insertしているコードを見ても問題はない。 カラムを確認すると…… 2個目のカラム ...