Golang — как вызывается эта функция

#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. Да, это называется замыканием функций.