Я использую этот код (я нашел его в сети и изменил), который в основном выходит и загружает контент из интернета в виде патчей, а затем я добавляю элементы из канала в слайс, проблема в том, что весь слайс имеет один и тот же тип вэто.
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
}
Это может быть что-то легко, но я новичок в ходу и не знаю, почему.