#go
#Вперед
Вопрос:
Я работаю с этим примером кода, но не могу понять, как вызывается эта функция и какой параметр принадлежит.
go func(r []string) {
processData(r)
ch <- r
}(record)
Комментарии:
1. вы пробовали документацию? golang.org/doc
2. не могли бы вы дать название главы относительно этого
Ответ №1:
Функции Go могут быть замыканиями. Замыкание — это значение функции, которое ссылается на переменные извне своего тела. Функция может обращаться к переменным, на которые даны ссылки, и назначать их; в этом смысле функция «привязана» к переменным.
Чтобы понять это:
go func(r []string) {
processData(r)
ch <- r
}(record)
давайте сначала объявим эту функцию:
func routine(r []string) {
processData(r)
ch <- r
}
и эта глобальная переменная:
var ch = make(chan []string)
Теперь вы можете вызвать ее:
go routine(record)
это вызывает функцию routine
с именем входного параметра, названного record
как goroutine .
И посмотрите: https://gobyexample.com/goroutines
Попробуйте это на игровой площадке Go:
package main
import (
"encoding/csv"
"flag"
"fmt"
"io"
"os"
"strings"
"time"
)
func routine(r []string) {
processData(r)
ch <- r
}
var ch = make(chan []string)
func main() {
start := time.Now()
flag.Parse()
fmt.Print(strings.Join(flag.Args(), "n"))
if *filename == "REQUIRED" {
return
}
csvfile, err := os.Open(*filename)
if err != nil {
fmt.Println(err)
return
}
defer csvfile.Close()
reader := csv.NewReader(csvfile)
i := 0
for {
record, err := reader.Read()
if err == io.EOF {
break
} else if err != nil {
fmt.Println(err)
return
}
i
go routine(record)
fmt.Printf("go %d %sn", i, record)
}
for ; i >= 0; i-- {
fmt.Printf("<- %d %sn", i, <-ch)
}
fmt.Printf("n/s", time.Since(start).Seconds())
}
func processData([]string) {
time.Sleep(10 * time.Millisecond)
}
var filename = flag.String("f", "REQUIRED", "source CSV file")
var numChannels = flag.Int("c", 4, "num of parallel channels")
//var bufferedChannels = flag.Bool("b", false, "enable buffered channels")
Комментарии:
1. Итак, я должен понимать это как неименную функцию с немедленным вызовом типа «лямбда»?
2. Да, это называется замыканием функций.