Tôi có một hàm trong Go trả về hai giá trị. Tôi muốn chạy điều này như một goroutine, nhưng tôi không thể tìm ra cú pháp để tạo một kênh nhận hai giá trị. ai đó có thể chỉ cho tôi đi đúng hướng?Cách tạo kênh nhận nhiều giá trị trả lại từ một goroutine
19
A
Trả lời
29
Xác định loại tùy chỉnh có các trường cho cả hai giá trị, sau đó tạo chan
loại đó.
EDIT: Tôi cũng đã thêm một ví dụ (ngay ở dưới cùng) sử dụng nhiều kênh thay vì loại tùy chỉnh. Tôi không chắc đó là thành ngữ hơn.
Ví dụ:
type Result struct {
Field1 string
Field2 int
}
sau đó
ch := make(chan Result)
Ví dụ về cách sử dụng một kênh của một kiểu tùy chỉnh (Playground):
package main
import (
"fmt"
"strings"
)
type Result struct {
allCaps string
length int
}
func capsAndLen(words []string, c chan Result) {
defer close(c)
for _, word := range words {
res := new(Result)
res.allCaps = strings.ToUpper(word)
res.length = len(word)
c <- *res
}
}
func main() {
words := []string{"lorem", "ipsum", "dolor", "sit", "amet"}
c := make(chan Result)
go capsAndLen(words, c)
for res := range c {
fmt.Println(res.allCaps, ",", res.length)
}
}
Tạo:
Lorem, 5
Ipsum, 5
dolor, 5
SIT, 3
Amet, 4
EDIT: Ví dụ sử dụng nhiều kênh thay vì một kiểu tùy chỉnh để tạo đầu ra tương tự (Playground) :
package main
import (
"fmt"
"strings"
)
func capsAndLen(words []string, cs chan string, ci chan int) {
defer close(cs)
defer close(ci)
for _, word := range words {
cs <- strings.ToUpper(word)
ci <- len(word)
}
}
func main() {
words := []string{"lorem", "ipsum", "dolor", "sit", "amet"}
cs := make(chan string)
ci := make(chan int)
go capsAndLen(words, cs, ci)
for allCaps := range cs {
length := <-ci
fmt.Println(allCaps, ",", length)
}
}
@ nick-craig-wood Cảm ơn bạn đã chỉnh sửa, gửi vội vã một phần. – Intermernet
Điều đó quá tệ; dường như đánh bại toàn bộ điểm cho phép nhiều giá trị trả về –
Điểm thú vị. Sẽ rất tuyệt khi có thể thực hiện 'c: = make (chan string, err)' hoặc tương tự và có các cấu trúc dữ liệu có liên quan được tạo ra "đằng sau hậu trường". Có thể đáng để yêu cầu tính năng Go? – Intermernet