Go
What is Casbin オープンソースのアクセス制御ライブラリ。 GoやJava、Node.js、PHP、Pythonなどをサポート。 What Casbin does subject(主語)、object(目的語)、action(行動)をベースとして柔軟に「許可」「不許可」を定義することができる。 RBAC(…
Cloud Pub/Sub Cloud Pub/Subは、GCPの環境を使って、手軽にPublisherとSubscriberを構成できる、Googleによるクラウドツールです。 概要については、こちらに記載していますのでご覧ください。 Cloud Functions Cloud Functionsは、GCPの環境を使って、手軽…
POSTでbodyの入力を任意としたいけど、JSONの形式がちゃんとあっているかエラーハンドリングしたい場合。 func decodeJSON(r *http.Request, dst interface{}) error { dec := json.NewDecoder(r.Body) return dec.Decode(dst) } create(w http.ResponseWrit…
Goでのトランザクションの構築方法と、トランザクションの利用ケースについて触れます。 MySQLなどのデータベースにアクセスする際、Goではdatabaseパッケージを使うことができます。 databaseパッケージを用いてトランザクションを構築するには、Txを使いま…
runtimeパッケージのCallerを用いて取得することができます。 package main import ( "runtime" "fmt" ) func main() { pc, pwd, line, ok := runtime.Caller(0) fn := runtime.FuncForPC(pc) fmt.Println(pc, pwd, line, ok, fn.Name()) } runtime.Caller()…
概要 GoとCloud Functions、さらにSend Gridというメールサービスを使って、HTTPリクエストからメールを送信できる機能を開発します。 さらに、関数を記載したGithubリポジトリへmasterブランチへのマージがあれば、Cloud Funcitonsへデプロイして関数を更新…
ライブラリvalidatorを使って、structのバリデーションを行うことができます。 基本的な使い方は公式ドキュメントやQiitaの優良記事に譲るとして、ここでは備忘の意味も込めて、私が引っかかった点を紹介します。 ペアにしたフィールドのうち、全てが空にな…
Goのversion 1.12以降では、$GOPATH/src以下のパッケージ管理を改め、go.modによって依存関係を管理できるようになりました。 まずは、Goのversionを確認し、必要に応じて最新化します。 $ go version $ brew upgrade go Modulesを試すには、下記コマンドに…
日付の範囲を指定したり、7月だけといったように指定する方法を紹介します。 日付の範囲 // min ~ max WHERE <カラム名> BETWEEN min AND max // min ~ maxではない範囲 WHERE <カラム名> NOT BETWEEN min AND max 年、月、日の指定 // 年月日の指定 WHERE D…
depはパッケージのバージョン・依存関係管理ツールで、Node.jsでいうところのnpmにあたるものです。 go getコマンドでインストールする場合と異なり、同じプロジェクト内で安全に同じバージョンのパッケージを使うよう管理することができます。チームで開発…
パッケージをインストールして正しくcommandを入力しても実行できない場合、いわゆる「PATHが通っていない」状態かもしれません。 $ echo $GOPATH $ echo $PATH で、それぞれの環境変数を確認することができます。 $GOPATHはgoの作業ディレクトリです。ファ…
swaggoという外部パッケージを利用することで、Swaggerを使って作成済みのGoのソースコードからAPIドキュメントを作成できます。 install パッケージをインストールします。 $ go get github.com/swaggo/swag/cmd/swag APIに関する記述を規定のフォーマット…
SQLの時刻がUTC時刻になってしまう問題を解決します。 sql, err := sql.Open("mysql", "user:passward@/dbname?parseTime=true&loc=Asia%2FTokyo") このようにparseTime=trueに併せてlocを指定しないと、例えソースコード側でJST時刻を指定しても、sql接続時…
SQLの取得結果をHas Manyの形で格納したいことがあるかもしれません。しかし、SQLでのSELECTの結果は階層化されていないので、ソースコードでロジックを組んで組み立てる必要があります。 Goの場合、SQLの取得結果を1行ずつ処理できるrow.Next()があるので、…
SQLのSELECTの結果がNULLを返し、それを何らかのデータに格納する場合、格納先のデータの型を特別なものに指定する必要があります。 NULLを返すSQLを使用する場合、次のコードはエラーになります。 type someModel struct { code int name string } func mai…
SQLビルダーのライブラリSquirrelです。SQL文の命令を、SQLの構文のようにGo言語によって記述することができます。 GitHub - Masterminds/squirrel: Fluent SQL generation for golang 使用方法は下記公式の案内に記載されていますが、 squirrel - GoDoc sou…
クライアントとサーバーの通信を、クライアントではaxiosを用いる例です。 ユーザーに関する情報をサーバーでデータベースに保存しておき、 ログイン後のページで、そのデータを利用して表示を変えることを想定します。 例えば次のコードを見てみます。 goフ…
POSTまたはPUTのformデータをサーバーサイドに送信する際、 axiosでは、デフォルトでJSON形式にしてrequest payloadに乗せて送られます。 HTTP.Requestは次のようになっています。 POST /some-path HTTP/1.1 Content-Type: application/json { "username" : …
フロントをVue (port :8081)で、サーバーをGo (port :8080)で実行した時、Safariは「開発」メニューから一時的にCross-Originの制限を無効にすることができますが、Chromeにはそれらしきものが見当たらず、Headerにセットすることにしました。備忘として残し…
TLSを使ったHTTPS通信を紹介します。 2015年にはGoogleがHTTPS通信を行うサイトを、検索結果において優遇すると宣言したように、どのサイトでもTLSを用いたHTTPS通信が要求される時代です。 証明書、秘密鍵の生成 TLSを使用するには、その方式で使われる証明…
CookieにJSONの内容を格納する際などは、base64を用いて事前にエンコードし、Cookieから取り出した後にデコードします。 Cookieには許容されない文字を使うと、Cookieにそもそも登録できない、または異なるValueの値が登録されてしまうからです。 func main(…
複数の関数で、DBコネクションを使い回す場合には、注意が必要です。 dbだけでなく、sql.Open()の返り値に含まれるerrもpackageグローバルに定義して、 sql.Open()の返り値のアサインは「:=」ではなく、「=」を使用します。 var db *sql.DB var err error //…
インストール sql-Driverごとにpackageをインストールする必要があります。 $ go get -u github.com/go-sql-driver/mysql import database/sqlは、コード中で使用するものの、mysqlについてはプログラムの起動処理には使われますが、コード中では使用しない…
著者が初めて使用する度に書き加えていくもので、網羅しているわけではありません。 単一ファイルの実行 $ go run main.go package mainが複数ファイルに分かれている場合の実行 $ go build $ ./<exe-name > // デフォルトのexe名は、project名 もしくは $ go build -o </exe-name>…
処理を実行するごとにsessionの有効期限を更新し、ログアウト時に、他のユーザーに関するsession情報も含めて、 一定時間を超えたsessionを削除する機能を用意します。 過去の記事を基にしています。 Session【Go】 - 技術向上 bcryptでパスワードをhash化【…
サードパーティのbcryptを使用します。 bcrypt - GoDoc シンプルな記述で暗号化でき、暗号の強度も数字や定数を指定するだけです。 暗号化 暗号化の対象(byte配列)とコスト(暗号の強度)を引数にとり、byte配列とエラーを返します。 bs, err := bcrypt.Ge…
Sessions、Users sessionの簡単な例をお見せします。 sessionsテーブルとusersテーブルを用いてユーザー情報を管理するイメージです。 sessionsテーブルのunique idをキーに、usersテーブルの情報を引き出します。 main.goです。 type user struct { // 各ユ…
サードパーティのパッケージを使用します。 GitHub - satori/go.uuid: UUID package for Go func main() { http.HandleFunc("/", index) http.HandleFunc("/read", read) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServe(":8080",…
CookieにはMaxAgeという、有効期限を秒数で指定する属性があります。 Goでは、このMaxAgeにマイナス値か0を設定することで、対象のCookieを削除することができます。 func main() { ... http.HandleFunc("/delete", delete) // 「/delete」にアクセスしたらd…
Cookieをセットし、Nameを指定してセットしたCookieを取得する例です。 func main() { http.HandleFunc("/", set) http.HandleFunc("/read", read) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServe(":8080", nil) } func set(w ht…