2017-12-08 5 views
-2

私は答えを探してみた(私はこれが基本的なコンセプトだと思う)が、私は直接私に関連するものを見つけることができませんでした...だからここに私の投稿です。潜在的な変数スコープ(多分ポインタ)の混乱?わからない

私は現在、自分のサーバーからログファイルを解析しており、プロセスの一部を自動化するスクリプトを作成しています(新しいスキルを学んで、仕事を楽にするなど)。私は、各行を分割するための単純化されたパーサを構築しました。私は無関係なので、かなりのコードを省いています。ここで

は私の関数である:あなたが、私は別のセクションで「parsedDataSet」変数をプリントアウトするとき、それは別の保持見ることができるように

Sample result from a test file.

:ここ

var parsedDataSet = make(map[int][]string) 

func parseData(dataSet []string) { 
    var tempArray []string 
    for index, element := range dataSet { 
     tempData := strings.Fields(element) 
     tempArray = append(tempArray, tempData[0], tempData[3][1:]+" "+tempData[4][:len(tempData[4])-1], tempData[5][1:], tempData[6], tempData[7][:len(tempData[7])-1], tempData[8], tempData[9]) 
     parsedDataSet[index] = tempArray 
     fmt.Println(parsedDataSet[index]) 
     tempArray = tempArray[:0] 
    } 
    fmt.Println("------") 
    fmt.Println(parsedDataSet[0]) 
    fmt.Println(parsedDataSet[1]) 
    fmt.Println(parsedDataSet[2]) 
    fmt.Println(parsedDataSet[3]) 
} 

は、サンプルの結果であり、値。上の "------"改行は、私が望む値です。以下は、 "for"ループの外側に表示されている値です。私はそれが "for"ループ内の値を割り当てているので、可変スコープに傾いています。しかし、私は代入のためにグローバル変数にアクセスしていますので、私はそれがグローバルスコープに伝わると仮定しています。

私はまだ新しくなっていますので、私はまだそれを愛する言語でかなり勉強しています。私は問題の周りに私の頭を包むことはできません。私はこれをPython(私の現在の言語)で書き直しましたが、これはほぼ同じように完全に正常に動作しました。

ありがとうございました!

+2

再利用されている必要があります。これは、Goでのスライスの仕組みではありません。 https://blog.golang.org/slicesを読んで、Go to https://tour.golang.org/moretypes/6 ffをご覧ください。 – Volker

+0

洞察をいただきありがとうございますが、私はツアー・オブ・ゴー・ノートと様々な作品をスタックオーバーフローで直接作りました。 :) スライスを使って何かを逃してしまったかどうかを調べてみましょう。ありがとう。 – teepleb

答えて

2

スライスの割り当てはコピーを実行しません。単なるポインタです。これは、すべてのparsedDataSetエントリが同じスライスであることを意味します。

最も簡単な解決策は、var tempArray []stringをforループ内に移動することです。スライスの詳細については

とどのように再スライスした作品、あなたはあなたがtempArrayをread up on the details

+0

私は上記の私の投稿を編集した、私はマップの初期化を含むことを忘れてしまった。私は本質的にはデータを取ってマップに入れ、数値をキー値として使用しています。 私はGoドキュメントをもう一度見直しますが、Goドキュメントとスタックオーバーフローのすぐ近くでこれを構築しました。 いずれにせよ、私はそれを受け入れられた回答とマークしてupvoteを与えました。ご協力いただきありがとうございます。毎回tempArrayを再作成するだけのソリューションです。 – teepleb

関連する問題