golang 国名API

コードだけ

```golang
package gorm_sample

import (
	"bufio"
	"bytes"
	"container/list"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"path/filepath"
	"strings"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

type Country struct {
	gorm.Model
	Name string `json:"name"`
}

var (
	db  *gorm.DB
	err error
)

func GormMain() {
	// countryNames := getCountryNames()

	db, err = gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
	if err != nil {
		fmt.Printf("%s", err)
		return
	}

	// db.AutoMigrate(&Country{})

	// countries := make([]Country, len(countryNames))

	// for i, name := range countryNames {
	// 	countries[i] = Country{Name: name}
	// }

	// db.CreateInBatches(countries, 100)

	router := gin.Default()
	router.GET("/countries", func(c *gin.Context) {
		var countries []struct {
			Name string
		}
		db.Model(&Country{}).Select("name").Find(&countries)

		c.JSON(http.StatusOK, gin.H{"countries": countries})
	})
	router.GET("/countries/:name", func(c *gin.Context) {

	})
	router.Run()
}

func getCountryNames() []string {
	visitor := NewVisitor()

	filepath.Walk("./", visitor.Visit)
	// filepath.Globは**に対応していない。

	if !visitor.Contains("Country") {
		fmt.Println("国名データなし。")
		return []string{}
	}

	path := visitor.Find("Country")

	data, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Println(err)
		return []string{}
	}
	buf := bytes.NewBuffer(data)
	bs := bufio.NewScanner(buf)
	countryNames := make([]string, 0)

	for bs.Scan() {
		countryNames = append(countryNames, bs.Text())
	}

	return countryNames
}

type Visitor struct {
	paths *list.List
	cache []string
}

func (v *Visitor) Contains(pat string) bool {
	for _, path := range v.Paths() {
		if strings.Contains(path, pat) {
			return true
		}
	}
	return false
}

// こういった処理で検索値がもとまらない時の値はどうすればよい?
// 1 戻り値の型のゼロ値を返す。
// 2 nilを返す。
// 3 戻り値に見つかったかのパラメータをboolとして入れる
// 4 戻り値に見つかったかのパラメータをerrorとして入れる
// 5 panicを起こす
// containsなどを用意して事前にチェックしていることを前提にしているかによっても変わる？

func (v *Visitor) Find(str string) string {
	for _, path := range v.Paths() {
		if strings.Contains(path, str) {
			return path
		}
	}
	return ""
}

func (v *Visitor) Paths() []string {
	if len(v.cache) != 0 {
		return v.cache
	}

	paths := make([]string, 0)
	for path := v.paths.Front(); path != nil; path = path.Next() {
		paths = append(paths, path.Value.(string))
	}
	v.cache = paths
	return paths
}

func NewVisitor() Visitor {
	return Visitor{
		paths: list.New(),
		cache: nil,
	}
}

func (v *Visitor) Visit(path string, info os.FileInfo, err error) error {
	v.paths.PushBack(path)
	return nil
}

func (v *Visitor) Print() {
	for path := v.paths.Front(); path != nil; path = path.Next() {
		fmt.Printf("%s\n", path.Value.(string)) // print out the elements
	}
}

```

```txt
アイスランド共和国
アイルランド
アゼルバイジャン共和国
アフガニスタン・イスラム共和国
アメリカ合衆国
アラブ首長国連邦
アルジェリア民主人民共和国
アルゼンチン共和国
アルバニア共和国
アルメニア共和国
アンゴラ共和国
アンティグア・バーブーダ
アンドラ公国
イエメン共和国
イスラエル国
イタリア共和国
イラク共和国
イラン・イスラム共和国
インド
インドネシア共和国
ウガンダ共和国
ウクライナ
ウズベキスタン共和国
ウルグアイ東方共和国
英国（グレートブリテン及び北アイルランド連合王国）
エクアドル共和国
エジプト・アラブ共和国
エストニア共和国
エスワティニ王国
エチオピア連邦民主共和国
エリトリア国
エルサルバドル共和国
オーストラリア連邦
オーストリア共和国
オマーン国
オランダ王国
ガーナ共和国
カーボベルデ共和国
ガイアナ共和国
カザフスタン共和国
カタール国
カナダ
ガボン共和国
カメルーン共和国
ガンビア共和国
カンボジア王国
北マケドニア共和国
ギニア共和国
ギニアビサウ共和国
キプロス共和国
キューバ共和国
ギリシャ共和国
キリバス共和国
キルギス共和国
グアテマラ共和国
クウェート国
クック諸島
グレナダ
クロアチア共和国
ケニア共和国
コートジボワール共和国
コスタリカ共和国
コソボ共和国
コモロ連合
コロンビア共和国
コンゴ共和国
コンゴ民主共和国
サウジアラビア王国
サモア独立国
サントメ・プリンシペ民主共和国
ザンビア共和国
サンマリノ共和国
シエラレオネ共和国
ジブチ共和国
ジャマイカ
ジョージア
シリア・アラブ共和国
シンガポール共和国
ジンバブエ共和国
スイス連邦
スウェーデン王国
スーダン共和国
スペイン王国
スリナム共和国
スリランカ民主社会主義共和国
スロバキア共和国
スロベニア共和国
セーシェル共和国
赤道ギニア共和国
セネガル共和国
セルビア共和国
セントクリストファー・ネービス
セントビンセント及びグレナディーン諸島
セントルシア
ソマリア連邦共和国
ソロモン諸島
タイ王国
大韓民国
タジキスタン共和国
タンザニア連合共和国
チェコ共和国
チャド共和国
中央アフリカ共和国
中華人民共和国
チュニジア共和国
チリ共和国
ツバル
デンマーク王国
ドイツ連邦共和国
トーゴ共和国
ドミニカ国
ドミニカ共和国
トリニダード・トバゴ共和国
トルクメニスタン
トルコ共和国
トンガ王国
ナイジェリア連邦共和国
ナウル共和国
ナミビア共和国
ニウエ
ニカラグア共和国
ニジェール共和国
ニュージーランド
ネパール
ノルウェー王国
バーレーン王国
ハイチ共和国
パキスタン・イスラム共和国
バチカン市国
パナマ共和国
バヌアツ共和国
バハマ国
パプアニューギニア独立国
パラオ共和国
パラグアイ共和国
バルバドス
ハンガリー
バングラデシュ人民共和国
東ティモール民主共和国
フィジー共和国
フィリピン共和国
フィンランド共和国
ブータン王国
ブラジル連邦共和国
フランス共和国
ブルガリア共和国
ブルキナファソ
ブルネイ・ダルサラーム国
ブルンジ共和国
ベトナム社会主義共和国
ベナン共和国
ベネズエラ・ボリバル共和国
ベラルーシ共和国
ベリーズ
ペルー共和国
ベルギー王国
ポーランド共和国
ボスニア・ヘルツェゴビナ
ボツワナ共和国
ボリビア多民族国
ポルトガル共和国
ホンジュラス共和国
マーシャル諸島共和国
マダガスカル共和国
マラウイ共和国
マリ共和国
マルタ共和国
マレーシア
ミクロネシア連邦
南アフリカ共和国
南スーダン共和国
ミャンマー連邦共和国
メキシコ合衆国
モーリシャス共和国
モーリタニア・イスラム共和国
モザンビーク共和国
モナコ公国
モルディブ共和国
モルドバ共和国
モロッコ王国
モンゴル国
モンテネグロ
ヨルダン
ラオス人民民主共和国
ラトビア共和国
リトアニア共和国
リビア
リヒテンシュタイン公国
リベリア共和国
ルーマニア
ルクセンブルク大公国
ルワンダ共和国
レソト王国
レバノン共和国
ロシア連邦
北朝鮮
台湾
パレスチナ
香港
マカオ
北極
南極

```

```json:http://localhost:8080/countries
{"countries":[{"Name":"アイスランド共和国"},{"Name":"アイルランド"},{"Name":"アゼルバイジャン共和国"},{"Name":"アフガニスタン・イスラム共和国"},{"Name":"アメリカ合衆国"},{"Name":"アラブ首長国連邦"},{"Name":"アルジェリア民主人民共和国"},{"Name":"アルゼンチン共和国"},{"Name":"アルバニア共和国"},{"Name":"アルメニア共和国"},{"Name":"アンゴラ共和国"},{"Name":"アンティグア・バーブーダ"},{"Name":"アンドラ公国"},{"Name":"イエメン共和国"},{"Name":"イスラエル国"},{"Name":"イタリア共和国"},{"Name":"イラク共和国"},{"Name":"イラン・イスラム共和国"},{"Name":"インド"},{"Name":"インドネシア共和国"},{"Name":"ウガンダ共和国"},{"Name":"ウクライナ"},{"Name":"ウズベキスタン共和国"},{"Name":"ウルグアイ東方共和国"},{"Name":"英国（グレートブリテン及び北アイルランド連合王国）"},{"Name":"エクアドル共和国"},{"Name":"エジプト・アラブ共和国"},{"Name":"エストニア共和国"},{"Name":"エスワティニ王国"},{"Name":"エチオピア連邦民主共和国"},{"Name":"エリトリア国"},{"Name":"エルサルバドル共和国"},{"Name":"オーストラリア連邦"},{"Name":"オーストリア共和国"},{"Name":"オマーン国"},{"Name":"オランダ王国"},{"Name":"ガーナ共和国"},{"Name":"カーボベルデ共和国"},{"Name":"ガイアナ共和国"},{"Name":"カザフスタン共和国"},{"Name":"カタール国"},{"Name":"カナダ"},{"Name":"ガボン共和国"},{"Name":"カメルーン共和国"},{"Name":"ガンビア共和国"},{"Name":"カンボジア王国"},{"Name":"北マケドニア共和国"},{"Name":"ギニア共和国"},{"Name":"ギニアビサウ共和国"},{"Name":"キプロス共和国"},{"Name":"キューバ共和国"},{"Name":"ギリシャ共和国"},{"Name":"キリバス共和国"},{"Name":"キルギス共和国"},{"Name":"グアテマラ共和国"},{"Name":"クウェート国"},{"Name":"クック諸島"},{"Name":"グレナダ"},{"Name":"クロアチア共和国"},{"Name":"ケニア共和国"},{"Name":"コートジボワール共和国"},{"Name":"コスタリカ共和国"},{"Name":"コソボ共和国"},{"Name":"コモロ連合"},{"Name":"コロンビア共和国"},{"Name":"コンゴ共和国"},{"Name":"コンゴ民主共和国"},{"Name":"サウジアラビア王国"},{"Name":"サモア独立国"},{"Name":"サントメ・プリンシペ民主共和国"},{"Name":"ザンビア共和国"},{"Name":"サンマリノ共和国"},{"Name":"シエラレオネ共和国"},{"Name":"ジブチ共和国"},{"Name":"ジャマイカ"},{"Name":"ジョージア"},{"Name":"シリア・アラブ共和国"},{"Name":"シンガポール共和国"},{"Name":"ジンバブエ共和国"},{"Name":"スイス連邦"},{"Name":"スウェーデン王国"},{"Name":"スーダン共和国"},{"Name":"スペイン王国"},{"Name":"スリナム共和国"},{"Name":"スリランカ民主社会主義共和国"},{"Name":"スロバキア共和国"},{"Name":"スロベニア共和国"},{"Name":"セーシェル共和国"},{"Name":"赤道ギニア共和国"},{"Name":"セネガル共和国"},{"Name":"セルビア共和国"},{"Name":"セントクリストファー・ネービス"},{"Name":"セントビンセント及びグレナディーン諸島"},{"Name":"セントルシア"},{"Name":"ソマリア連邦共和国"},{"Name":"ソロモン諸島"},{"Name":"タイ王国"},{"Name":"大韓民国"},{"Name":"タジキスタン共和国"},{"Name":"タンザニア連合共和国"},{"Name":"チェコ共和国"},{"Name":"チャド共和国"},{"Name":"中央アフリカ共和国"},{"Name":"中華人民共和国"},{"Name":"チュニジア共和国"},{"Name":"チリ共和国"},{"Name":"ツバル"},{"Name":"デンマーク王国"},{"Name":"ドイツ連邦共和国"},{"Name":"トーゴ共和国"},{"Name":"ドミニカ国"},{"Name":"ドミニカ共和国"},{"Name":"トリニダード・トバゴ共和国"},{"Name":"トルクメニスタン"},{"Name":"トルコ共和国"},{"Name":"トンガ王国"},{"Name":"ナイジェリア連邦共和国"},{"Name":"ナウル共和国"},{"Name":"ナミビア共和国"},{"Name":"ニウエ"},{"Name":"ニカラグア共和国"},{"Name":"ニジェール共和国"},{"Name":"ニュージーランド"},{"Name":"ネパール"},{"Name":"ノルウェー王国"},{"Name":"バーレーン王国"},{"Name":"ハイチ共和国"},{"Name":"パキスタン・イスラム共和国"},{"Name":"バチカン市国"},{"Name":"パナマ共和国"},{"Name":"バヌアツ共和国"},{"Name":"バハマ国"},{"Name":"パプアニューギニア独立国"},{"Name":"パラオ共和国"},{"Name":"パラグアイ共和国"},{"Name":"バルバドス"},{"Name":"ハンガリー"},{"Name":"バングラデシュ人民共和国"},{"Name":"東ティモール民主共和国"},{"Name":"フィジー共和国"},{"Name":"フィリピン共和国"},{"Name":"フィンランド共和国"},{"Name":"ブータン王国"},{"Name":"ブラジル連邦共和国"},{"Name":"フランス共和国"},{"Name":"ブルガリア共和国"},{"Name":"ブルキナファソ"},{"Name":"ブルネイ・ダルサラーム国"},{"Name":"ブルンジ共和国"},{"Name":"ベトナム社会主義共和国"},{"Name":"ベナン共和国"},{"Name":"ベネズエラ・ボリバル共和国"},{"Name":"ベラルーシ共和国"},{"Name":"ベリーズ"},{"Name":"ペルー共和国"},{"Name":"ベルギー王国"},{"Name":"ポーランド共和国"},{"Name":"ボスニア・ヘルツェゴビナ"},{"Name":"ボツワナ共和国"},{"Name":"ボリビア多民族国"},{"Name":"ポルトガル共和国"},{"Name":"ホンジュラス共和国"},{"Name":"マーシャル諸島共和国"},{"Name":"マダガスカル共和国"},{"Name":"マラウイ共和国"},{"Name":"マリ共和国"},{"Name":"マルタ共和国"},{"Name":"マレーシア"},{"Name":"ミクロネシア連邦"},{"Name":"南アフリカ共和国"},{"Name":"南スーダン共和国"},{"Name":"ミャンマー連邦共和国"},{"Name":"メキシコ合衆国"},{"Name":"モーリシャス共和国"},{"Name":"モーリタニア・イスラム共和国"},{"Name":"モザンビーク共和国"},{"Name":"モナコ公国"},{"Name":"モルディブ共和国"},{"Name":"モルドバ共和国"},{"Name":"モロッコ王国"},{"Name":"モンゴル国"},{"Name":"モンテネグロ"},{"Name":"ヨルダン"},{"Name":"ラオス人民民主共和国"},{"Name":"ラトビア共和国"},{"Name":"リトアニア共和国"},{"Name":"リビア"},{"Name":"リヒテンシュタイン公国"},{"Name":"リベリア共和国"},{"Name":"ルーマニア"},{"Name":"ルクセンブルク大公国"},{"Name":"ルワンダ共和国"},{"Name":"レソト王国"},{"Name":"レバノン共和国"},{"Name":"ロシア連邦"},{"Name":"北朝鮮"},{"Name":"台湾"},{"Name":"パレスチナ"},{"Name":"香港"},{"Name":"マカオ"},{"Name":"北極"},{"Name":"南極"}]}
```