go+rest+firestore local test
ローカルでの動作確認
以下の環境を作成しDB(ローカルのダミー)登録まで確認する。
言語
go言語
DB
firestore
ローカルでエミュレータを使う
GCPにプロジェクトはありで、firestoreのAPIも開始してある。
たぶんローカル側でfirestoreの初期化?をしたときに、firestoreを全く使ってなかった既存プロジェクトを選択して自動設定してもらったんだと思う。
DBそのものは未作成(セキュリティルール?もなし)
rest
GMOコインの公開APIをちょっと使わせてもらっている。
GoogleCloud 上の firestore の状況
必要なツール
一度動かしているので、すでにインストール済みです。
gitは直接的には使ってないけど入れといた。
node.jsはfirebase-tooksをインストールするために必要らしい。
jdkはfirebase-toolsを実行するために必要らしい。
winget install --id Microsoft.PowerShell --source winget
winget install --id Git.Git -e
winget install --id=GoLang.Go -e
winget install OpenJS.NodeJS.LTS -e
npm install -g firebase-tools
winget install Microsoft.OpenJDK.17 -e
PS C:\Users\yuki> git --version
git version 2.49.0.windows.1
PS C:\Users\yuki> go version
go version go1.24.3 windows/amd64
PS C:\Users\yuki> node --version
v22.16.0
PS C:\Users\yuki> npm --version
11.4.1
PS C:\Users\yuki> firebase --version
14.4.0
PS C:\Users\yuki> java --version
openjdk 17.0.15 2025-04-15 LTS
OpenJDK Runtime Environment Microsoft-11369865 (build 17.0.15+6-LTS)
OpenJDK 64-Bit Server VM Microsoft-11369865 (build 17.0.15+6-LTS, mixed mode, sharing)
PS C:\Users\yuki>
その他
vscode は使います。
前回 vscode で実行したときに、go言語のデバッグツール?が自動的にインストールされたと思う。
リモート系は別件でインストールしたので関係なしのはず。
goプロジェクト作成&実行
ディレクトリを作成し、その中で vscode を起動する。
mkdir go02
cd go02
code .
まずは rest のみ
package main
import (
"io"
"log"
"net/http"
)
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
resp, err := http.Get("https://forex-api.coin.z.com/public/v1/status")
if err != nil {
log.Print(err)
return
}
defer resp.Body.Close()
buf, err := io.ReadAll(resp.Body)
if err != nil {
log.Print(err)
return
}
log.Printf("%d [%s]", resp.StatusCode, resp.Status)
log.Print(string(buf))
}
初期化
go mod init chottodake.dev/go02
vscode で実行
launch.json も作る(中身は変更しない)
デバッガの選択は go を、choose debug configuraion は Launch Package を選択しました。
出来上がったファイルの内容です。(コメントは削除しました)
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}"
}
]
}
F5 で実行しました。動いています♪
go.sumがないけど
無い状態のままで go build などをすると、必要に応じて?作ってくれるみたいだけど ...
なんとなく調べると go mod tidy
をすれば作成されるので、なければやっておいた方がいいみたい。
go mod tidy
module chottodake.dev/go02
go 1.24.3
反応がなかった。依存関係がなさすぎて、作成する必要がないのかな。
おためし build
ならば build したらどうだ。と思いましたが、なんにもなしで実行ファイルが出来上がって、ちゃんと動きました。
go build
firestore の処理を追加
firestore の処理部分を追加しました。import{} の中は全行削除して保存すると、vscodeの拡張機能ちゃんが自動的に追加してくれました。(事前に動作確認しているソースと同じ状態です)
package main
import (
"context"
"encoding/json"
"io"
"log"
"net/http"
firebase "firebase.google.com/go"
)
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
ctx := context.Background()
app, err := firebase.NewApp(ctx, nil)
if err != nil {
log.Print(err)
return
}
client, err := app.Firestore(ctx)
if err != nil {
log.Print(err)
return
}
defer client.Close()
log.Print("Firestore ready.")
resp, err := http.Get("https://forex-api.coin.z.com/public/v1/status")
if err != nil {
log.Print(err)
return
}
defer resp.Body.Close()
buf, err := io.ReadAll(resp.Body)
if err != nil {
log.Print(err)
return
}
log.Printf("%d [%s]", resp.StatusCode, resp.Status)
log.Print(string(buf))
var tickerData map[string]interface{}
err = json.Unmarshal(buf, &tickerData)
if err != nil {
log.Print(err)
return
}
docRef := client.Collection("gmo_forex_ticker").Doc("latest")
_, err = docRef.Set(ctx, tickerData)
if err != nil {
log.Print(err)
return
}
log.Print("insert OK")
}
ただし、想定通りエラーがでています。
ここで go get
なのかな。しかし go mod tidy
やってみます。
go mod tidy
わらわらと動いて go.mod が更新され、 go.sum も作成されました。エラーも解消しています。
ここまでは完璧かな♪
firestore をローカルで動かす
firestore をローカル環境で疑似的に動かすための設定を追加します。
firebase エミュレータの設定
go02フォルダの中で次のコマンドを実行します。たぶん .firebaserc と firebase.json ができあがるはず。firebase-debug.log に操作ログも残るみたい。
firebase init emulators
firebase-debug.log はないですね。途中で中断したときだけ残るのかな。
{
"projects": {
"default": "apis-open-chottodake-dev"
}
}
{
"emulators": {
"firestore": {
"port": 8080
},
"ui": {
"enabled": true,
"port": 4000
},
"singleProjectMode": true
}
}
vscode の設定
vscode がローカルの firebase エミュレータを使ってくれるように設定します。
設定する内容はさっき出来上がったファイルの中身とあわせる感じです。
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}",
"env": {
"FIRESTORE_EMULATOR_HOST": "127.0.0.1:8080",
"GOOGLE_CLOUD_PROJECT": "apis-open-chottodake-dev"
}
}
]
}
環境変数を二つ追加しただけです。(全部で4行と、と、その上の行の行末にカンマを!)
実行します
長かったです。ついにです。
エミュレータの起動
PowerShell でエミュレータを起動します。(vscode 内のターミナルでもいい)
firebase emulators:start --only firestore
エミュレータUIの表示
起動したメッセージのなかにUIへのリンクがあるので、ブラウザで開く。
デバック実行
いい感じですね♪
ほんと、長かった。
とりあえず以上です。