2015-01-09 15 views
0

채널 통신과 동시에 Reader.Read를 만들고 싶습니다. 이것은 goroutine 오버 헤드를위한 하나의 코드입니다.

type ReturnRead struct { 
    n int 
    err error 
} 

type ReadGoSt struct { 
    Returnc <-chan ReturnRead 
    Nextc chan struct{} 
} 

func (st *ReadGoSt) Close() { 
    defer func() { 
     recover() 
    }() 
    close(st.Next) 
} 

func ReadGo(r io.Reader, b []byte) *ReadGoSt { 
    returnc := make(chan ReturnRead) 
    nextc := make(chan bool) 

    go func() { 
     for range nextc { 
      n, err := r.Read(b) 
      returnc <- ReturnRead{n, err} 
      if err != nil { 
       return 
      } 
     } 
    }() 

    return &ReadGoSt{returnc, nextc} 
} 

: 2 : 그래서 그것을 실행하는 방법은 두 가지

1 만든

func ReadGo(r io.Reader, b []byte) <-chan ReturnRead { 
    returnc := make(chan ReturnRead) 
    go func() { 
     n, err := r.Read(b) 
     returnc <- ReturnRead{n, err} 
    }() 
    return returnc 
} 

내가 코드 2가 생성하는 생각을 너무 많은 오버 헤드가 더 나은 코드가

? 1? 2?

답변

1

코드 1이 더 빠르고 더 빠를 것입니다. 코드 2는 한 번 읽습니다. 그러나 두 가지 해결책 모두가 좋지 않다고 생각합니다. 당신은 read를 반복하고 읽은 바이트만을 되돌려 보내야한다.