根据https://blog.golang.org/strings和我的测试,看起来当我们range一个字符串时,我们得到的字符是rune种,但是如果我们到str[index]得到它,他们就会是byte种,为什么呢?

推荐答案

对于第一个层次,why是因为这是how the language is defined.String type告诉我们:

字符串值是(可能为空的)字节序列.字节数称为字符串的长度,从不为负数.字符串是不可变的:一旦创建,就不可能更改字符串的内容.

以及:

字符串的字节可以通过整数索引0到len(s)-1访问.

同时,range是一个可以插入到for statement中的子句,说明书上写着:

"Range"子句右边的表达式称为range expression,它可能是…[A]字符串.

以及:

  1. 对于字符串值,"range"子句迭代字符串中从字节索引0开始的Unicode代码点.在连续迭代中,索引值将是字符串中连续UTF-8编码代码点的第一个字节的索引,第二个rune类型的值将是相应代码点的值.如果迭代遇到无效的UTF-8序列,第二个值将是0xFFFD,Unicode替换字符,下一次迭代将在字符串中前进一个字节.

如果你想知道为什么语言是这样定义的,你真的必须问问定义者自己.然而,请注意,如果for只在字节范围内,那么你需要构建自己的更奇特的循环来覆盖符文.假设for ... range does处理符文,如果want处理字符串s中的字节,则可以编写:

for i := 0; i < len(s); i++ {
    ...
}

并且容易地在循环内访问s[i].您还可以编写:

for i, b := range []byte(s) {
}

并且访问循环内的索引i和字节b.(从字符串到[]byte的转换或从字符串到[]byte的转换可能需要副本,因为[]byte可以修改.不过,在这种情况下,range不会修改它,编译器可以优化掉副本.请参见smidgen584610_58635831">icza's comment below或this answergolang: []byte(string) vs []byte(*string).)所以你没有失go 任何能力,也许只是smidgen的简洁性.

Go相关问答推荐

"k8s.io/apimachinery/pkg/runtime.对象(缺少方法DeepCopyBody)

如何将泛型函数作为参数传递给golang中的另一个函数?

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

map 中的多个函数类型,Golang

按键值排序字符串- Golang

使用Go使用Gorm使用外键对数据进行排序

GORM:一个表的两个外键

Cypher 查找(多个)最低 node

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

如何绕过深层 xml,没有嵌套循环?

通过多阶段构建复制到 Docker 容器中时找不到文件

如何使用 sync.WaitGroup 来执行所有的 goroutine?

设置指向空接口的指针

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

如何在 helm 中将字符串连接到 .AsConfig 的结果?

Golang - 客户 Unmarshaler/Marshaler 在指针上具有 nil/null 值

如何在眼镜蛇(golang)中将标志作为参数传递?

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

在 VSCode 中使用命令行参数调试 Go 测试