アプリケーションの設定ファイルを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
}