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)
}
}
Các vấn đề liên quan
- 1. Trả lại nhiều giá trị trong javascript?
- 2. Nhiều giá trị trả lại trong python
- 3. Nhận giá trị trả lại của fputcsv
- 4. Cách nhận giá trị trả lại từ một exec trong tập lệnh ant
- 5. Giá trị trả lại từ chrome.tabs.executeScript
- 6. Trả lại giá trị từ Chủ đề
- 7. Nhận nhiều giá trị khóa từ Redis
- 8. Cách khởi tạo với nhiều giá trị trả lại bằng C++ (0x)
- 9. Trả lại nhiều giá trị từ một phương thức trong Mục tiêu-C
- 10. Phương thức phải trả lại nhiều giá trị
- 11. FMDatabaseQueue Cách trả lại giá trị
- 12. Ajax nhận được một giá trị trả về từ php?
- 13. thế nào để trả lại nhiều giá trị từ một phương pháp
- 14. Kênh của Go có trả về hai giá trị không?
- 15. Macro trả lại giá trị
- 16. Cách trả về giá trị Enum từ một chuỗi?
- 17. Giá trị nào mà một hàm khởi tạo có thể trả về để tránh trả lại giá trị này?
- 18. Xem giá trị trả lại?
- 19. Golang goroutine không chạy với kênh bên trong
- 20. Nhận giá trị trả về từ PhoneGap Plugin
- 21. Trả về hai và nhiều giá trị từ phương thức
- 22. Trả về giá trị từ nhiều lựa chọn ListView
- 23. (extjs) Nhận giá trị được chọn của nút radio dưới dạng. Không trả lại giá trị
- 24. Cách trả lại một hàng từ nhóm theo nhiều cột
- 25. nodeJS trả về giá trị từ gọi lại
- 26. Một cách để tách các giá trị trả lại từ java.io.File.listFiles trong Clojure
- 27. Giá trị trả lại "chấp nhận được" từ cv :: calibrateCamera là gì?
- 28. Cách tốt nhất để trả về nhiều giá trị từ một hàm bằng Python là gì?
- 29. Trả lại nhiều kết quả từ một phương thức
- 30. Có cần trả lại một giá trị trong Main() không?
@ 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