如何实现数据先进先出(FIFO)?Go语言代码问题求助
Go代码无法实现FIFO输出,输出结果逆序
我希望以下Go语言代码实现先进先出(FIFO)的输出效果,但当前代码输出是逆序的,第一个输出的总是最后输入的内容。
原代码:
package main import ( "bufio" "fmt" "os" ) func main() { scanner := bufio.NewScanner(os.Stdin) for { scanner.Scan() input := scanner.Text() if input == "" { break } defer fmt.Println(input) } }
运行结果:
$ go run main.go 1 2 3 3 2 1
问题原因
问题出在defer的特性上——defer语句会将函数调用延迟到当前函数退出前执行,而且多个defer遵循栈式执行顺序:后声明的defer会先被执行。所以输入1时添加的defer会最后执行,输入3时添加的defer会最先执行,最终输出顺序完全反转。
解决方案
不要用defer延迟输出,而是先把所有输入内容存储到一个切片中,等输入结束后,遍历切片依次输出,就能实现FIFO效果。
修改后的代码:
package main import ( "bufio" "fmt" "os" ) func main() { scanner := bufio.NewScanner(os.Stdin) var inputs []string for { scanner.Scan() input := scanner.Text() if input == "" { break } inputs = append(inputs, input) } // 按输入顺序遍历输出 for _, s := range inputs { fmt.Println(s) } }
运行结果示例:
$ go run main.go 1 2 3 1 2 3
内容的提问来源于stack exchange,提问作者zacharyy
相关产品推荐
相关产品推荐

