アプリケーションの設定ファイルをyamlやjsonで管理していて、複数の環境がある場合に、共通の設定値と環境ごとの設定値に分けて管理することがあると思います。Kustomize のようなイメージです。
Go でそうした複数の設定値をマージする処理を書くには darccio/mergo が利用できます。
mergoはstructやmapをマージすることのできるライブラリですので、yamlやjsonのロードは別途ライブラリを入れるなどして実装します。 以下が実装例となります。
package main
import (
"flag"
"fmt"
"log"
"os"
"path"
"dario.cat/mergo"
"github.com/goccy/go-yaml"
)
func main() {
var dir string
flag.StringVar(&dir, "dir", "", "")
flag.Parse()
fileInDir, err := os.ReadDir(dir)
if err != nil {
log.Fatalf("open file or dir: %v\n", err)
}
files := make([]string, 0)
for _, v := range fileInDir {
files = append(files, path.Join(dir, v.Name()))
}
merged, err := merge(files)
if err != nil {
log.Fatal(err)
}
m, err := yaml.Marshal(merged)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", string(m))
}
func merge(files []string) (map[string]any, error) {
var merged map[string]any
for _, f := range files {
content, err := os.ReadFile(f)
if err != nil {
return merged, err
}
var s map[string]any
err = yaml.Unmarshal(content, &s)
if err != nil {
return merged, err
}
if err := mergo.Merge(&merged, s); err != nil {
return merged, err
}
}
return merged, nil
}