Open8

go+rest+firestore local test

ピン留めされたアイテム
yukipyukip

ローカルでの動作確認

以下の環境を作成しDB(ローカルのダミー)登録まで確認する。

言語

go言語

DB

firestore
ローカルでエミュレータを使う
GCPにプロジェクトはありで、firestoreのAPIも開始してある。
たぶんローカル側でfirestoreの初期化?をしたときに、firestoreを全く使ってなかった既存プロジェクトを選択して自動設定してもらったんだと思う。
DBそのものは未作成(セキュリティルール?もなし)

rest

GMOコインの公開APIをちょっと使わせてもらっている。

yukipyukip

GoogleCloud 上の firestore の状況

yukipyukip

必要なツール

一度動かしているので、すでにインストール済みです。
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言語のデバッグツール?が自動的にインストールされたと思う。

リモート系は別件でインストールしたので関係なしのはず。

yukipyukip

goプロジェクト作成&実行

ディレクトリを作成し、その中で vscode を起動する。

mkdir go02
cd go02
code .

まずは rest のみ

hello.go
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 を選択しました。
出来上がったファイルの内容です。(コメントは削除しました)

launch.json
{
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}"
        }
    ]
}

F5 で実行しました。動いています♪

yukipyukip

go.sumがないけど

無い状態のままで go build などをすると、必要に応じて?作ってくれるみたいだけど ...
なんとなく調べると go mod tidy をすれば作成されるので、なければやっておいた方がいいみたい。

go mod tidy
go.mod
module chottodake.dev/go02

go 1.24.3

反応がなかった。依存関係がなさすぎて、作成する必要がないのかな。

おためし build

ならば build したらどうだ。と思いましたが、なんにもなしで実行ファイルが出来上がって、ちゃんと動きました。

go build

yukipyukip

firestore の処理を追加

firestore の処理部分を追加しました。import{} の中は全行削除して保存すると、vscodeの拡張機能ちゃんが自動的に追加してくれました。(事前に動作確認しているソースと同じ状態です)

hello.go
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 も作成されました。エラーも解消しています。
ここまでは完璧かな♪

yukipyukip

firestore をローカルで動かす

firestore をローカル環境で疑似的に動かすための設定を追加します。

firebase エミュレータの設定

go02フォルダの中で次のコマンドを実行します。たぶん .firebaserc と firebase.json ができあがるはず。firebase-debug.log に操作ログも残るみたい。

firebase init emulators

firebase-debug.log はないですね。途中で中断したときだけ残るのかな。

.firebaserc
{
  "projects": {
    "default": "apis-open-chottodake-dev"
  }
}
firebase.json
{
  "emulators": {
    "firestore": {
      "port": 8080
    },
    "ui": {
      "enabled": true,
      "port": 4000
    },
    "singleProjectMode": true
  }
}

vscode の設定

vscode がローカルの firebase エミュレータを使ってくれるように設定します。
設定する内容はさっき出来上がったファイルの中身とあわせる感じです。

launch.json
{
    "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行と、と、その上の行の行末にカンマを!)

yukipyukip

実行します

長かったです。ついにです。

エミュレータの起動

PowerShell でエミュレータを起動します。(vscode 内のターミナルでもいい)

firebase emulators:start --only firestore

エミュレータUIの表示

起動したメッセージのなかにUIへのリンクがあるので、ブラウザで開く。

デバック実行


いい感じですね♪

ほんと、長かった。
とりあえず以上です。