在Golang的Scanln中使用符号而不是字符串

时间:2016-10-16 19:45:46

标签: go

以下是从控制台读取输入的代码

var message string
fmt.Scanln(&message)

但是我想尝试使用rune,它是字节的unicode

var input []rune
fmt.Scanln(input)

根据我的C / C ++知识,数组的引用可以通过它的名称传递,我认为它适用于符文

但令人惊讶的是,该程序在符号的情况下通过了Scanln,甚至没有使用控制台输入

那是做错了什么的?或者它无法完成?或者它需要类型转换为字符串?

1 个答案:

答案 0 :(得分:2)

你所拥有的是一个切片而不是一个数组,它们在Go

中有所不同

当您从字符串中读取每个字符时,您将获得一个符文,例如:

for _, rune := range input { ... }
// or
input[0] // it returns a rune

现在,如果你想使用索引或更多unicode操作,你应该记住,每个符文都有一个长度,长度也影响字符串的长度,请参阅此示例以更好地理解,例如,您看到3个字符字符串,但长度为5:

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {

    input := "a界c"

    fmt.Println(len(input))

    for index, rune := range input {
        fmt.Println(index, utf8.RuneLen(rune), string(rune))    
    }

    fmt.Println(input[1:4]) // we know that the unicode character '界'
                            // starts in index 1 and ends in index 3
}

在此处运行:https://play.golang.org/p/xvmH1laevS