我正在與this sample代碼一起工作,但無法理解如何調用此函數以及屬於哪個參數。Golang - 如何調用這個函數
go func(r []string) {
processData(r)
ch <- r
}(record)
我正在與this sample代碼一起工作,但無法理解如何調用此函數以及屬於哪個參數。Golang - 如何調用這個函數
go func(r []string) {
processData(r)
ch <- r
}(record)
轉到功能可能會倒閉。閉包是一個函數值, 引用它身體外部的變量。該函數可以訪問 並分配給引用的變量;從這個意義上說,函數是 「綁定」到變量。
要理解這一點:
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
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 %s\n", i, record)
}
for ; i >= 0; i-- {
fmt.Printf("<- %d %s\n", i, <-ch)
}
fmt.Printf("\n%2fs", 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")
的章節名稱所以我應該把它理解爲非名字函數,立即調用像'lambda'? –
是的,它被稱爲函數閉包。 – 2016-10-02 10:30:20
謝謝,它幫助我很多:) –
你嘗試的文件? https://golang.org/doc – cat
你能給出一個相對於這個 –