1 回答
TA贡献1828条经验 获得超3个赞
在这个例子中,你并没有真正做任何事情,但是通过通道传递消息总是安全的——通道是语言中的基本并发原语之一。你让自己对竞争条件的可能性持开放态度,这取决于send实际最终做什么。处理此问题的另一种方法是send从单个通道接收。
type Mailer struct{
Messages chan Message
}
func (m *Mailer) send() {
for message := range m.Messages {
fmt.Printf("Sending email to:`%s`\nSubject: %s\n%s\n\n", message.To, message.Subject, message.Body)
}
}
var mailer *Mailer
func Index(w http.ResponseWriter, r *http.Request) {
m := Message{"email@example.com", fmt.Sprintf("visited `%s`", r.URL.Path[1:]), "Lorem ipsum"}
mailer.Messages <- m
fmt.Fprintf(w, "Sent out email with subject line `%s`\n", m.Subject)
}
func main() {
mailer = &Mailer{
// buffer up to 100 message to be sent before blocking
Messages: make(chan Message, 100),
}
// start the mailer send loop
go mailer.send()
...
- 1 回答
- 0 关注
- 166 浏览
添加回答
举报