package door import ( "log" "strings" "syscall" ) // https://go101.org/article/channel-closing.html func Writer2(handle int, d *Door) { log.Println("Writer2") defer d.wg.Done() for { select { case <-d.closeChannel: // close((*d).writerChannel) log.Println("~Writer2") return default: } select { case <-d.closeChannel: // close((*d).writerChannel) log.Println("~Writer2") return case output, ok := <-d.writerChannel: if !ok { // (*d).writerChannel = nil log.Println("closeChannel") // close(d.closeChannel) d.Disconnected = true close(d.writerChannel) log.Println("~Writer2") return // d.closeChannel <- true // continue } else { // log.Println("output") if strings.HasSuffix(output, RestorePos) { output += Color(d.LastColor...) } else { d.UpdateLastColor(output, &d.LastColor) } // log.Println("write output") buffer := []byte(output) n, err := syscall.Write(handle, buffer) if (err != nil) || (n != len(buffer)) { // close((*d).writerChannel) // (*d).writerChannel = nil log.Println("closeChannel") // close(d.closeChannel) d.Disconnected = true close(d.writerChannel) log.Println("~Writer2") return // d.closeChannel <- true // continue } } } } } func Writer(handle int, writerChannel *chan string) { for output := range *writerChannel { buffer := []byte(output) n, err := syscall.Write(handle, buffer) if (err != nil) || (n != len(buffer)) { close(*writerChannel) break } } }