2016-10-02 58 views
-1

我正在與this sample代碼一起工作,但無法理解如何調用此函數以及屬於哪個參數。Golang - 如何調用這個函數

go func(r []string) { 
    processData(r) 
    ch <- r 
}(record) 
+1

你嘗試的文件? https://golang.org/doc – cat

+0

你能給出一個相對於這個 –

回答

1

function closures

轉到功能可能會倒閉。閉包是一個函數值, 引用它身體外部的變量。該函數可以訪問 並分配給引用的變量;從這個意義上說,函數是 「綁定」到變量。

要理解這一點:

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

嘗試在The Go Playground

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") 
+0

的章節名稱所以我應該把它理解爲非名字函數,立即調用像'lambda'? –

+0

是的,它被稱爲函數閉包。 – 2016-10-02 10:30:20

+1

謝謝,它幫助我很多:) –