fmt.Println 同时输出 主机情况:a, named数量: 主机情况:bbbbb, named数量:如何控制 named数量在同一列并且上下对齐
时间: 2024-02-23 11:03:03 浏览: 21
你可以使用格式化字符串来控制输出格式。例如:
```
fmt.Printf("主机情况:%10s, named数量:%d\n", "a", 5)
fmt.Printf("主机情况:%10s, named数量:%d\n", "bbbbb", 10)
```
其中 `%10s` 表示输出字符串占用 10 个字符的宽度,并且右对齐。如果要左对齐,可以使用 `%-10s`。`%d` 表示输出整数。
这样输出的结果,就可以让两个 named 数量在同一列并且上下对齐了。
相关问题
func tickerSourceChan(ack <-chan interface{}) chan interface{} { out := make(chan interface{}) ackCounter := uint64(0) go func() { for i := 0; i < 10; i++ { msg := &myMessage{RandomCarNum()} out <- msg fmt.Println("Source sended:", msg,">>",i) } close(out) }() go func() { for element := range ack { fmt.Println("ACK received:", element, ackCounter) ackCounter++ } fmt.Println("Ack closed:",ackCounter) }() return out } 如何检测ack closed
你可以在 `for` 循环中使用 `range`,当 `ack` 的 channel 被关闭时,`for` 循环会自动结束,如下所示:
```
func tickerSourceChan(ack <-chan interface{}) chan interface{} {
out := make(chan interface{})
ackCounter := uint64(0)
go func() {
defer close(out)
for i := 0; i < 10; i++ {
msg := &myMessage{RandomCarNum()}
out <- msg
fmt.Println("Source sended:", msg, ">>", i)
}
}()
go func() {
for element := range ack {
fmt.Println("ACK received:", element, ackCounter)
ackCounter++
}
fmt.Println("Ack closed:",ackCounter)
}()
return out
}
```
在第二个 goroutine 中,使用 `range` 来遍历 `ack` 的 channel。当 `ack` 的 channel 被关闭时,`range` 循环会自动结束,然后就可以打印 `Ack closed` 并退出 goroutine。
func randomChain() chan interface{} { data := Data{0} nc := make(chan interface{},4096) count := int64(0) go func() { ticker := time.NewTicker(1 * time.Second) for { select { case <-ticker.C: fmt.Println("Per second: ", count, len(nc)) count = 0 default: nc <- &data count++ } } }() go func() { ticker := time.NewTicker(1 * time.Second) for { select { case <-ticker.C: fmt.Println("Per second: ", count, len(nc)) count = 0 default: nc <- &data count++ } } }() // 在程序退出时打印管道中的剩余数据数量 c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c fmt.Println("Remaining data count:", len(nc)) os.Exit(1) }() return nc } 优化
这段代码中存在两个重复的 goroutine,它们的代码实现是完全一样的,可以将它们合并成一个。另外,可以将计数器和 ticker 的定义提到外部函数中,避免重复定义。最后,在程序退出时,可以直接使用 defer 关键字来打印管道中的剩余数据数量,避免使用 signal 包。
下面是优化后的代码:
```
func randomChain() chan interface{} {
data := Data{0}
nc := make(chan interface{}, 4096)
count := int64(0)
ticker := time.NewTicker(1 * time.Second)
go func() {
for {
select {
case <-ticker.C:
fmt.Println("Per second: ", count, len(nc))
count = 0
default:
nc <- &data
count++
}
}
}()
// 在程序退出时打印管道中的剩余数据数量
defer func() {
fmt.Println("Remaining data count:", len(nc))
}()
return nc
}
```