Добавление элемента из Chanel в фрагмент сохраняет тот же элемент в фрагменте - PullRequest
0 голосов
/ 03 ноября 2019

Я использую этот код (я нашел его в сети и изменил), который в основном выходит и загружает контент из интернета в виде патчей, а затем я добавляю элементы из канала в слайс, проблема в том, что весь слайс имеет один и тот же тип вэто.

type Response struct {
    result interface{}
    err    error
}

// Dispatcher
func dispatcher(in []string, reqChan chan *http.Request) {
    defer close(reqChan)
    for i := 0; i < len(in); i++ {
        req, err := http.NewRequest("GET", in[i], nil)
        if err != nil {
            log.Println(err)
        }
        reqChan <- req
    }
}

// Worker Pool
func workerPool(max int, reqChan chan *http.Request, respChan chan Response, fn interface{}, methodName string) {
    t := &http.Transport{}
    for i := 0; i < max; i++ {
        go worker(t, reqChan, respChan, fn, methodName)
    }
}

// Worker
func worker(t *http.Transport, reqChan chan *http.Request, respChan chan Response, fn interface{}, methodName string) {
    for req := range reqChan {
        resp, err := t.RoundTrip(req)
        inputs := make([]reflect.Value, 1)
        inputs[0] = reflect.ValueOf(resp)
        t := reflect.ValueOf(fn).MethodByName(methodName).Call(inputs)
        r := Response{t, err}
        respChan <- r
    }

}

func main() {

    c := repository.Coin{}
    flag.Parse()
    runtime.GOMAXPROCS(runtime.NumCPU())
    reqChan := make(chan *http.Request)
    respChan := make(chan Response)
    allCoin, _ := c.GetCoins()

    test := make([]string, 20)
    for i := 0; i < 20; i++ {
        test[i] = allCoin[i]
    }

    all := make([]*repository.Coin, 0)
    go dispatcher(allCoin, reqChan)
    go workerPool(10, reqChan, respChan, &c, "ParseCoin")

    i := 0
    for item := range respChan {
        if item.err != nil {
            log.Println(item.err)
        } else {
            resp := item.result.([]reflect.Value)
            coin, _ := resp[0].Interface().(*repository.Coin)
            if coin != nil {
                all = append(all, coin)
                println(coin.Name)// prints different name
            }
        }
        if i == len(allCoin)-1 {
            close(respChan)
        }
        i = i + 1
    }
    fmt.Println(all[1].Name) //same name 
    fmt.Println(all[2].Name)//same name 
    fmt.Println(all[3].Name)//same name 
    fmt.Println(all[4].Name)//same name 
}

Это может быть что-то легко, но я новичок в ходу и не знаю, почему.

...