2016-02-04 3 views
1

При переходе по каналу я хотел бы получить индекс - чтобы его можно было добавить в массив.go looping channels, но отсутствует индекс

package main 

import (
    "fmt" 
) 

func main() { 
    tasks := []string{"foo", "bar", "baz"} 
    results := process(tasks) 

    for result := range results { // index? 
    fmt.Println(result) // I would like to add result to an array of results? 
    // newresults[index] = result??? 
    } 
} 

func process(tasks []string) <-chan string { 
    ch := make(chan string) 
    go func() { 
    for index, task := range tasks { 
     ch <- fmt.Sprintf("processed task %d: %s", index, task) 
    } 
    close(ch) 
    }() 
    return ch 
} 

ответ

2

Например,

i := 0 
for result := range results { 
    fmt.Println(result) 
    newresults[i] = result 
    i++ 
} 
+0

Я думаю :-) Почему бы мне не спросить. Спасибо –

2

Aternatively ответить peterSO, вы можете просто использовать append, чтобы добавить в конце вашего среза.

+0

Я думал об этом, но это даст штраф за исполнение - не так ли? Так как каждый раз придется прокладывать внутреннюю петлю. Вот почему я добавлю к массиву результатов. –

+0

@ChrisG .: что вы подразумеваете под «внутренней петлей через каждый раз»? Append необходимо сделать копию, когда она выделяет больший базовый массив, но это не каждый раз. Если вы предварительно выделите емкость, это эквивалентно присвоению по индексу в любом случае. – JimB

+0

Я думал, что копирование, которое добавляет, сделает какой-то цикл. –

1

Каналы не имеют указателя. Если вы хотите отслеживать счет, создайте свою собственную переменную счета и увеличивайте ее в цикле for.

Альтернативой является создание структуры с индексом и именем задачи.

package main 

import (
    "fmt" 
) 

type Task struct { 
    Index int 
    Task string 
} 

func main() { 
    tasks := []string{"foo", "bar", "baz"} 
    results := process(tasks) 
    myresults := make([]*Task, 3) 

    for result := range results { // index? 
     fmt.Println(result) // I would like to add result to an array of results? 
     // results[index] = result??? 
     myresults[result.Index] = result 
    } 
} 

func process(tasks []string) <-chan *Task { 
    ch := make(chan *Task) 
    go func() { 
     for index, task := range tasks { 
      t := &Task{Index: index, Task: task} 
      ch <- t 
      // ch <- fmt.Sprintf("processed task %d: %s", index, task) 
     } 
     close(ch) 
    }() 
    return ch 
} 
Смежные вопросы