如何在Go语言中正确扫描读取rune类型?
如何正确用Go扫描读取rune类型
你当前代码的问题在于fmt.Scan(&c)并非按字符(rune)方式读取输入,而是将输入解析为整数赋值给rune变量。比如输入字符a时,它会尝试把a当作整数解析,失败后c保持默认值0,导致fmt.Printf("%c", c)输出空字符,看不到内容。
以下是几种正确的解决方式:
- 使用
fmt.Scanf指定%c格式符,直接读取单个字符并转换为rune:
package main import "fmt" func main() { var c rune fmt.Scanf("%c", &c) fmt.Printf("%c", c) }
- 使用
bufio.Reader的ReadRune方法,适合处理多字节Unicode字符(如中文、emoji):
package main import ( "bufio" "os" ) func main() { reader := bufio.NewReader(os.Stdin) c, _, err := reader.ReadRune() if err != nil { panic(err) } print(string(c)) }
- 手动读取字节并转换为rune(需处理多字节情况):
package main import ( "os" "unicode/utf8" ) func main() { buf := make([]byte, 4) // rune最多占用4字节 n, err := os.Stdin.Read(buf) if err != nil { panic(err) } c, _ := utf8.DecodeRune(buf[:n]) print(string(c)) }
如果只是读取单个ASCII或Unicode字符,fmt.Scanf("%c", &c)是最简单的方案;若需处理复杂输入场景,优先选择bufio.Reader的ReadRune方法。
内容的提问来源于stack exchange,提问作者Dodeiro
相关产品推荐
相关产品推荐

