golang

ドメインレイヤの実装をサブドメインごとに管理する

自分は以下の書籍で各レイヤ構造に対する実装を Go で解説しているが、 書籍を書いてからも異なるパターンを色々と試行錯誤していた。 pospome.booth.pm 書籍内ではユーティリティ系の実装を配置するパッケージとして "コアレイヤ" というレイヤの話があるが…

MOVED Error from Redis Cluster(AWS Elasticache) in redis-go

以下の UniversalClient で Redis Cluster(AWS Elasticache) にアクセスしたところ、 "MOVED 1738 127.0.0.1:6379" みたいなエラーが発生した。 www.pospome.work MOVED というエラー自体は Redis Cluster のもので、アクセス対象のデータを持っているノード…

go-redis でクラウド上の Redis Cluster とローカルに立てた Redis を同じコードで動かす

最近 go-redis を使っているのだが、"クラウド上は Redis Cluster で、ローカルは開発用の Single Redis をサクッと Docker で立てる" みたいなことをしたいと思った。 しかし、go-redis では Redis Cluter と Single Redis が異なるクライアントとして定義…

Goのアーキテクチャとフレームワークについて

社内slackでGoについて質問されて、それなりに長文で回答したのでその内容を加筆修正したものをブログに残しておく。 質問内容としては以下のイメージ。 RubyだとRailsがあり、MVCを利用することになるが、Goだとそこらへんはどうなるのか? Go初心者なのでGo…

depで"does not contain usable Go code (*build.NoGoError).. (Package is required by (root).)"のエラー

プライベートのプロジェクトで"dep ensure -add github.com/xxx"すると以下のエラーが出た。 Solving failure: No versions of github.com/xxx met constraints: 0.1.1: Could not introduce github.com/xxx@master, as its subpackage github.com/xxx does …

Goの並列テストと現在時刻に依存した実装について

Mercari Advent Calendar 2018 の13日目は株式会社メルペイ認証基盤チームの @pospome がお送りします。メルカリのアドベントカレンダーで特定の実装パターンの網羅集みたいなやつを書こうと思ったんだけど、組み合わせ爆発でまとめきれそうにないな・・・。…

Go における FunctionalOptionPattern と MethodChaining について考える

きっかけ FunctionalOptionPattern MethodChaining MethodChaining の問題点 Error フィールドによる解決方法 Error フィールドによる解決方法の問題 1. 各メソッドでエラーが発生しないような印象を受ける 2. エラーチェックを忘れそう その1 3. エラーチェ…

golang の「埋め込み」を利用した実装アンチパターン

最近、time.Time を独自の struct で埋め込んだ実装をみかけたので書いておこうと思った。結論から言うと、 標準パッケージやライブラリで定義されている型に対して「埋め込み」を使うと、 コードが正常に動かなくなる可能性があるので、 注意した方がいいと…

GAE/Go の urlfetch のタイムアウトを設定する

ググると、旧 appgneine パッケージに対する設定方法しか引っかからないので、 google.golang.org/appengine に対する設定方法をメモとして残しておく。結論から言うと、 context.WithTimeout() or context.WithDeadline() を利用して設定する。以下は conte…

goddd とは何か?

これは Go Advent Calendar 2017 その2 6日目の記事です。 https://qiita.com/advent-calendar/2017/go2みなさん、こんにちは。 pospome です。 普段は GAE/Go でサーバサイドの開発をしています。twitter では 実装パターン, DDD, golang, GCP についてつぶ…

golang のレイヤ構造において、他のコードに影響なくインフラレイヤのデータソース実装を差し替えることは可能か?

最近、golang のレイヤ構造において、他のコードに影響なくインフラレイヤのデータソース実装を差し替えることは可能か? という質問を受けた。回答時間が限られている中で質問を受けたので、 「現実的には難しい」という雑な回答しかできなかった。さすがに…

Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える

devfest 2017 tokyo の発表資料です。 Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える from pospome 当日は入室できない人もいたらしい & 機材トラブルで10minほど開始が遅れてしまった ということで申し訳なく思っています。また、立…

goon で goon: Failed to decode field createdAt - gob: decoding into local type time.Time, received remote type []int のエラー

struct のフィールドを1つ削除してから goon で Get() したら以下のエラーが出た。 goon: Failed to decode field createdAt - gob: decoding into local type time.Time, received remote type []int craetedAt が decode できなかったらしい。 で、根本原…

golang の iota の使い所

自分は iota の使い所が分からなかった。 なんか事故りそうだし、明示的に値を宣言した方が分かりやすいような気がする。で、こんなツイートをしたら・・・#golang の iota 使った定数定義って、定数の並び順によって値が変わるから、なんか事故りやすい印象…

golang の 引数、戻り値、レシーバをポインタにすべきか、値にすべきかの判断基準について迷っている

日頃から引数にポインタを渡した方がいいのか? 値を渡した方がいいのか? 戻り値はどーなの? メソッドのレシーバは?なんて迷っているのでアウトプットしてみる。メソッドのレシーバについては以下に載っていた。 https://github.com/golang/go/wiki/CodeRevie…

Datastore/Go の cannot load field xxxx into a xxx: no such struct field は Goon で回避できる

以下のブログに書いてある通り、 pospome.hatenablog.comDatastore は kind の property が struct の field に存在しないと ErrFieldMismatch というエラーが発生する。「datastore: cannot load field xxxx into a xxx: no such struct field」のエラーと…

GAE/Go の goon が出力するエラーを止める

goonの内部で以下のようなエラーが出力されていた。 ERROR: goon - goon.go:194 - pospome error エラーメッセージの「pospome error」は以下のように自分が用意した error なので、 このエラーを返しているどこかで goon がエラーログを出力しているみたい…

Goのシンプルさについて

LT資料です。 Goのシンプルさについて from pospome

golang + mysql の ORM を色々調べた感想とおすすめ

普段は GAE で golang を使っているけど、 golang で mysql 使ったことないってのもどうなのかな? と思ったので、 ちょっとしたサンプルアプリを通して mysql を使ってみようと思った。 で、ORM どーしーよーかなと思って、 色々調べた記録です。 標準パッケ…

(2018/2/26 追記)Datastore/Go のデータ設計のコツ

僕の Datastore の記事は Cloud Datastore/AppEngine Datastore 時代のものなので、現在の Firestore の Datastore mode だと一部の内容が正しくないと思うので注意してください。(´・ω・`)— pospome (@pospome) March 24, 2021 Datastoreを使っていて、 あ…

Datastore/GO で datastore: flattening nested structs leads to a slice of slices: field xxx

以下のエラーが出た。 datastore: flattening nested structs leads to a slice of slices: field xxx Datastore は以下のように struct をネストすることができるが、 type A struct { B []B } type B struct { Name string } 以下のようにネストした struc…

Go で cannot assign to xxx のエラー

ググると色々情報があるが、 日本語の情報がないので書いておく。https://play.golang.org/p/atdCt2Mken ↑ これを実行すると「cannot assign to struct field users[0].Connected in map」のエラーが出る。結論から言うと map が問題らしい。go - Why do I g…

Go のブランク識別子を利用した import による pakcage への副作用

ORMを調べていると以下のような import を見かけた。 import _ "github.com/go-sql-driver/mysql" 調べてみると、 これはブランク識別子を利用した import で、 import 対象のパッケージを初期化するためのものらしい。つまり、 init() や package value と…

Go の init() が呼ばれる順番

結論から言うと、import される順番に依存する。以下のような main での import を例にすると、 first の init() が呼ばれた後に second の init() が呼ばれる。 package main import ( myapp/first //最初に呼ばれる myapp/second //次にこれが呼ばれる ) f…

struct に static method は必要か?

golang を触りたての頃、struct に static method を実装したいと思った。なぜかというと、 1つの package に function をずらーっと定義すると、 なんだか冗長な命名になってしまうから。 util.UserXxx() util.TeamXxx() util.EventXxx() package を切って…

struct に依存しない処理は function に切り出すのか、method に切り出すのか

以前少し考えて自己解決して終わったんだけど、 ちょっとしたきっかけがあったのでアウトプットしてみる。以下のような Person があって、 Hello(), Goodbye() には全く同じ「複雑な処理」がある場合・・・ type Person struct { name string } func (p *Per…

golang の WAF のオートリロード

https://github.com/codegangsta/gin ↑ この gin ってやつを使うと ソースコードの変更検知 + オートリロード が可能になる。 ちなみに、以下の WAF とは別物です。 https://github.com/gin-gonic/gin https://github.com/codegangsta/gin#supporting-gin-in…

golang のメソッド名の Must について

https://golang.org/pkg/regexp/#MustCompile ↑ こんな感じで Must が付いているものがある。 Must が付いているものは error を返す代わりに panic を発生させる。で上記の MustCompile() の説明文の一部が以下。 It simplifies safe initialization of glo…

golang の embedding について思ったこと

この記事は Go (その2) Advent Calendar 2016 の20日目の記事です。どーもpospomeです。(´・ω・`) GAE/GO の環境でサーバサイドエンジニアとして働いています。twitter では 実装パターン, DDD, golang, GCP についてつぶやくことが多いです。 同じような分…

パッケージの循環参照

循環参照についてです。 パッケージの循環参照 from pospome