2016-12-04 4 views
3

로그 메시지를 무작위로 생성하고 생성 된 후 로그에 기록하기 전에 시간 소인별로 정렬해야합니다. 나는 내 타임 스탬프에 따라 정렬 할 수 있도록 sort 라이브러리의 sort.Interface 부분을 활용하고 있습니다. 팬 - 인 동시성 (fan-in concurrency) 디자인을 사용하고 있으므로 정렬 기능은 goroutines의 모든 로그 메시지를 집계 한 다음 정렬합니다.Golang - 팬으로 정렬

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

이 왜 값을받을 수 없습니다 : I 채널에서 로그 메시지를받을 갈 때, 나는이 오류가, 그러나

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] 
} 

: 여기

내 코드입니다 채널에서?

답변

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 

마지막 줄은 채널을 통해 이르기까지의 경우에 적용되며, 첫 번째 반복 값이입니다 요소.

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