2016-12-04 4 views
3

私はランダムに多数のログメッセージを生成していますが、それらが生成された後、それらをログに書き込む前にタイムスタンプでソートする必要があります。私はsortライブラリのsort.Interfaceを利用していますので、タイムスタンプに基づいてソートすることができます。私はファンイン並行性設計を使用しています。そのため、ソート機能はゴルーチンからのすべてのログメッセージを集計し、ソートします。ここでGolang - ファンの並べ替え

が私のコードです:

type CommonLogFormat struct { 
    HostIP   string 
    UserIdent  string 
    User   string 
    Timestamp  string 
    Request  string 
    HttpStatusCode int 
    Size   int 
} 

type Logs struct { 
    Messages []*CommonLogFormat 
} 

func sortByTimestamp(ch chan <- *CommonLogFormat) *Logs { 
    logs := &Logs{Messages: make([]*CommonLogFormat, 1)} 

    for i := range ch { 
     logs.Messages = append(logs.Messages, <- i) 
    } 

    sort.Sort(logs) 

    return logs 
} 

func (l Logs) Len() int { 
    return len(l.Messages) 
} 

func (l Logs) Less(i,j int) bool { 
    return l.Messages[i].Timestamp < l.Messages[j].Timestamp 
} 

func (l *Logs) Swap(i,j int) { 
    l.Messages[i], l.Messages[j] = l.Messages[j], l.Messages[i] 
} 

しかし、私は、チャネルからのログメッセージを受信するために行くとき、私はこのエラーを取得する:

invalid operation: <-i (receive from non-chan type *CommonLogFormat) 

私は値を受け取ることができないのはなぜチャンネルから?

答えて

2

エラーメッセージはわかりやすいと思います。これを見て:

for i := range ch { 
    logs.Messages = append(logs.Messages, <- i) 
} 

ch

はタイプ chan <- *CommonLogFormatです。 chはチャンネルです。チャネル上の for rangeループは、チャネル上で送信された値を生成し、ループ変数 iに格納されます。 iはチャネルではなく、チャネルで送信された値なので、タイプは *CommonLogFormatです。

あなたは実際にそれを受け取ることができないので、それはすでにあなたがそれから受けたいと思うものです。単にiを追加します。

for i := range ch { 
    logs.Messages = append(logs.Messages, i) 
} 

ループ変数はfor rangeの場合には何かSpec: For statements詳細:

Range expression       1st value   2nd value 

array or slice a [n]E, *[n]E, or []E index i int a[i]  E 
string   s string type   index i int see below rune 
map    m map[K]V    key  k K  m[k]  V 
channel   c chan E, <-chan E  element e E 

最後の行は、チャネルを介し至るまでの場合に適用され、第1の反復値であります素子。

For channels, the iteration values produced are the successive values sent on the channel until the channel is closed . If the channel is nil , the range expression blocks forever.

+0

ああ、大丈夫です。それは実際には感謝します、ありがとう! – mxplusb

関連する問題