Rumah >pembangunan bahagian belakang >Golang >Kerjasama antara fungsi golang dan goroutine
Pengaturcaraan, fungsi dan gorout In Go bekerjasama untuk mencapai keselarasan. Satu goroutine dicipta dalam fungsi, dan pembolehubah tempatan bagi fungsi itu kelihatan dalam goroutine. Goroutine boleh digunakan dalam pertempuran sebenar untuk tugas pemprosesan serentak, seperti muat naik fail serentak Kecekapan boleh dipertingkatkan dengan mencipta goroutine yang bertanggungjawab untuk memuat naik fail yang berbeza. Apabila menggunakan goroutine, sila ambil perhatian: Buat goroutine dalam jumlah yang sesuai untuk mengelakkan kekurangan sumber tidak mempunyai nilai pulangan, dan anda perlu menggunakan concurrency primitif untuk mendapatkan keputusan tidak boleh dihentikan atau dibatalkan;
Dalam bahasa pengaturcaraan Go, goroutine ialah mekanisme konkurensi yang boleh mencipta benang ringan untuk melaksanakan kod. Fungsi dan goroutin bekerjasama untuk mencapai pengaturcaraan serentak yang cekap.
Goroutine boleh dibuat di dalam fungsi, dan pembolehubah dan pemalar tempatan dalam fungsi boleh dilihat dalam goroutine. Apabila Goroutine tamat, pembolehubah dan pemalar setempatnya akan dikitar semula.
Contoh berikut menunjukkan cara mencipta goroutine dan lulus parameter dalam fungsi:
package main import ( "fmt" "time" ) func printHello(name string) { fmt.Printf("Hello, %s!\n", name) } func main() { go printHello("World") time.Sleep(1 * time.Second) }
Dalam contoh di atas, fungsi utama
mencipta goroutine dan menghantar parameter "World"
. Goroutine melaksanakan fungsi printHello
dan mencetak "Hello, World!n"
. main
函数创建一个 goroutine 并传入参数"World"
。goroutine 执行 printHello
函数,打印出 "Hello, World!n"
。
考虑一个需要并发上传多个文件的用例:
package main import ( "context" "fmt" "io" "os" "path/filepath" "time" "cloud.google.com/go/storage" ) func uploadFile(w io.Writer, bucketName, objectName string) error { ctx := context.Background() client, err := storage.NewClient(ctx) if err != nil { return fmt.Errorf("storage.NewClient: %v", err) } defer client.Close() f, err := os.Open(objectName) if err != nil { return fmt.Errorf("os.Open: %v", err) } defer f.Close() ctx, cancel := context.WithTimeout(ctx, time.Second*30) defer cancel() o := client.Bucket(bucketName).Object(objectName) wc := o.NewWriter(ctx) if _, err := io.Copy(wc, f); err != nil { return fmt.Errorf("io.Copy: %v", err) } if err := wc.Close(); err != nil { return fmt.Errorf("Writer.Close: %v", err) } fmt.Fprintf(w, "File %v uploaded to %v.\n", objectName, bucketName) return nil } func main() { bucketName := "bucket-name" objectNames := []string{"file1.txt", "file2.txt", "file3.txt"} for _, objectName := range objectNames { go uploadFile(os.Stdout, bucketName, objectName) } }
在这个案例中,main
rrreee
Dalam kes ini, fungsiAtas ialah kandungan terperinci Kerjasama antara fungsi golang dan goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!