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

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

ただいまの
回答率

88.78%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 301

Palo_Punte

score 21

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を上書き保存したいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

var tmpl = template.Must(template.New("").Parse(`
...
var Person_list = []Person{
    Person{"taro", 20, "{{index . "Good Morning"}}"},
...
`))

func write(fp *os.File) error {
    return tmpl.Execute(fp, map[string]string{
        "Good Morning":"おはよう",
        "Hello":"こんにちは",
    })
}


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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/04 15:15

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

    キャンセル

  • 2020/08/04 16:20 編集

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

    キャンセル

  • 2020/08/04 21:12

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

    キャンセル

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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