質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

1回答

273閲覧

ファイルAを実行するとファイルBの内容の一部が上書き保存されるようにしたいです

Palo_Punte

総合スコア21

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/08/02 14:39

go1.13

hoge |---bbb.go |---aaa |---aaa.go
//bbb.goです package main import ( "hoge/aaa" ) func main(){ people := aaa.Person_list for _, v := range people { switch v.Comment{ case "Good morning": v.Comment = "おはよう" case "Hello": v.Comment = "こんにちは" case "Good evening": v.Comment = "こんばんは" } } }
//aaa.goです package aaa type Person struct { Name string Age int Comment string } var Person_list = []Person{ Person{"taro", 20, "Good morning"}, Person{"jiro", 13, "Hello"}, Person{"saburo", 39, "Good evening"}, }

bbb.goを実行するとaaa.goを

//aaa.goです package aaa type Person struct { Name string Age int Comment string } var Person_list = []Person{ Person{"taro", 20, "おはよう"}, Person{"jiro", 13, "こんにちは"}, Person{"saburo", 39, "こんばんは"}, }

のように書き換えたいのですがどのようにすれば良いのでしょうか?
bbb.goのfor文の処理以降書き換えたPersonを使用するという意味ではなくaaa.goのファイルの内容そのものを書き換えてaaa.goを上書き保存したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

text/templateなどで以下のようなテンプレート処理で出力するのはどうですか?

go

1var tmpl = template.Must(template.New("").Parse(` 2... 3var Person_list = []Person{ 4 Person{"taro", 20, "{{index . "Good Morning"}}"}, 5... 6`)) 7 8func write(fp *os.File) error { 9 return tmpl.Execute(fp, map[string]string{ 10 "Good Morning":"おはよう", 11 "Hello":"こんにちは", 12 }) 13}

上記の場合、aaa.goのソースはどこにも必要ではなく、aaa.go相当を
bbb.go相当のコードに埋め込んで、aaa.go全体を生成することになります。
bbb.goを実行すればaaa.goがまるまる再生成されます。

テンプレートを外部ファイルから読み込んで利用する例はtext/templateパッケージの解説にありますので
aaa.goのテンプレートソースを読み込んで処理するように変更することは容易にできます。

ソースコード生成の注意点としてはソースとなるコードと実際にコンパイルする時に参照するコードとは
別のファイルパス名にしておくことをお勧めします。(上書きしたいという目的とは合いませんが)

なぜなら、ソースコード生成を一度しか行わないのであればそのようなコードを最初から書けば良いということになってしまいます。ことなるユースケース別にコード生成したいからこその質問だと思います。
だとすると、元になるソースはいじらずに残しておくことが重要です。

またなぜそのようにしたいのかをお伝えいただければもっと良い方法を提示できるかもしれません。

投稿2020/08/03 01:25

編集2020/08/03 01:51
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobonobo

2020/08/03 01:28

例えばi18nという単語で検索してもらうと、目的に近いものかもしれません。
Palo_Punte

2020/08/03 09:56

ご回答ありがとうございます aaa.goを元にユースケース別にコードを生成したいのではなく、1日に一度クローリングをした値に入れ替えると言う事を考えていました 今回の場合ですとクロールのたびにコメントが変わるとすると 8/1クロール後↓に変更 var Person_list = []Person{ Person{"taro", 20, "おはよう"},  (略) } 8/2クロール後↓に変更 var Person_list = []Person{ Person{"taro", 20, "おやすみ"},  (略) } 8/3クロール後↓に変更 var Person_list = []Person{ Person{"taro", 20, "ニーハオ"},  (略) } のように毎日上書きしていきたいと思っていました ただ一部書き換えで考えていたのですが全部書き換えてしまう方が楽そうですね i18nは、ある言語の文言を別の言語の文言に翻訳してくれる機能などが出てきたのですがどう言うことになるのでしょうか? 該当しそうなものが見つからずよくわかりませんでした。すいません
nobonobo

2020/08/03 10:39

えっとそれはクロールごとにコンパイルするということでしょうか?
Palo_Punte

2020/08/03 11:22

コンパイルまでが必要なのかはよくわからないのですがaaa.goのファイルのクロールをしたい部分が変化されていればとりあえず良いかなと思っていました
nobonobo

2020/08/04 02:21 編集

コードを変化させたものにさらに変化を加えるようなコードは無秩序に近いものになってしまいます。おそらく期待した変化を与えることはできないし、期待するような結果を得るのも難しい方向へまっしぐらです。 またaaa.goにはコードとして何かの機能を働かせるつもりはあるんですよね? (どちらにせよソースを加工して出力という処理は一方通行が良いと思います。加工出力したものをまた加工するのはテストしにくいし、問題が起きた場合にコントロールできないと思います) たぶんもっとデータドリブンでコードが一定になる方法がおすすめです。 また、何をしようとしてこういうことをしようと思ったのかを教えていただけると回答しやすいです。
Palo_Punte

2020/08/04 06:15

そうなんですね クローリングしたデータをaaa.goに格納しそれをブラウザ表示させると言う事をやってみようと思っていました 素直にDBでやった方が良さそうかもしれないです
nobonobo

2020/08/04 07:21 編集

クローリングしたデータをそのままブラウザに表示するか、データ形式(JSONやCSV)で保存しておいて、それを読み込んでブラウザに表示しましょう。
Palo_Punte

2020/08/04 12:12

確かにファイルの書き換えよりもデータ形式保存の方が良さそうですね ご回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問