Go的字符串遍历,有两种方式:

  1. utf-8遍历
  2. unicode遍历
package main

import "fmt"

func main() {
str := "Hello,世界"
fmt.Println("Utf-8遍历")
for i := ; i < len(str); i++ {
ch := str[i]
fmt.Println(ch)
}
fmt.Println("Unicode遍历")
for _, ch1 := range str {
fmt.Println(ch1)
}
}

打印结果:

Utf-8遍历

Unicode遍历

上面代码执行后,会打印一串数字而不是字符。这是由于go语言中的字符串实际上是类型为byte的只读切片。或者说一个字符串就是一堆字节。这意味着,当我们将字符存储在字符串中时,实际存储的是这个字符的字节。一个字符串包含了任意个byte,它并不限定Unicode,UTF-8或者任何其他预定义的编码。

那么go语言用什么来表示字符呢,下面的例子可以验证一下:

package main

import (
"fmt"
"reflect"
) func main() {
str := "Hello,世界"
fmt.Println("Utf-8遍历")
for i := ; i < len(str); i++ {
ch := str[i]
ctype:=reflect.TypeOf(ch)
fmt.Printf("%s ",ctype)
}
fmt.Println("Unicode遍历")
for _, ch1 := range str {
ctype:=reflect.TypeOf(ch1)
fmt.Printf("%s ",ctype)
}
}

打印结果:

Utf-8遍历
uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8
Unicode遍历
int32 int32 int32 int32 int32 int32 int32 int32

代码运行后显示ch的类型为uint8,也就是byte类型,而ch1的类型为int32,也就是rune类型。

go语言中的源码定义为utf-8文本,不允许其他的表示。

但是也存在特殊处理,那就是字符串上使用for…range循环。

range循环迭代时,就会解码一个utf-8编码的rune。

现在既然已经知道上述不管哪种遍历方式,其实质都是字节。

所以在打印时,只需要将这些结果转化为字符字面值或者转换其输出类型就可以了。

下面是两种字符串遍历方式:

package main

import (
"fmt"
) func main() {
str := "Hello,世界"
fmt.Println("方法一 格式化打印")
for _, ch1 := range str {
fmt.Printf("%q",ch1) //单引号围绕的字符字面值,由go语法安全的转义
}
fmt.Println("方法二 转化输出格式")
for _, ch2 := range str {
fmt.Println(string(ch2))
}
}

打印结果:

方法一  格式化打印
'H''e''l''l''o'',''世''界' 方法二 转化输出格式
H
e
l
l
o
,

go语言基础之字符串遍历的更多相关文章

  1. C语言基础(9)-字符串格式化输入和输出

    1.字符串在计算机内部的存储方式 字符串是内存中一段连续的char空间,以’\0’结尾 2.printf函数,putchar函数 putchar输出一个char printf是输出一个字符串 prin ...

  2. go语言基础之字符串类型 和 字符与字符串类型的区别

    1.字符串类型 示例1: package main //必须有一个main包 import "fmt" func main() { var str1 string str1 = & ...

  3. 嵌入式-C语言基础:字符串比较函数strcmp及其实现

    #include<stdio.h> #include <string.h> int mystrcmp(char * p1,char * p2) { int ret=0; if( ...

  4. 嵌入式-C语言基础:字符串拼接函数strcat

    #include<stdio.h> #include <string.h> //实现字符串拼接 char * mystrcat(char * dest,char * src) ...

  5. 嵌入式-C语言基础:字符串strlen和sizeof的区别

    strlen表示的实际的字符串长度,不会把字符串结束符'\0'计算进去,而sizeof则不是实际的字符串长度,它会把字符串的结束标识符'\0'也包含进去. #include<stdio.h> ...

  6. 嵌入式-C语言基础:字符串结束标识符

    #include<stdio.h> int main() { char cdata[]={'h','e','l','l','o'}; char cdata2[]="hello&q ...

  7. [Python学习笔记1]Python语言基础 数学运算符 字符串 列表

    这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...

  8. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  9. C语言基础知识-数组和字符串

    C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...

随机推荐

  1. 网站robots.txt & sitemap.xml

    1. 如何查看网站的robots.txt 网址/robots.txt, 比如小米  https://www.mi.com/robots.txt sitemap.xml

  2. 【linux终端操作】

    1. ctr + alt + t 打开新的终端窗口2. ctr + shift + + 终端窗口字体放大3. ctr + - 终端窗口字体缩小4. ls : 查看目录下的文件信息5. pwd: 查看目 ...

  3. Java编程思想(后)

    Java编程思想(后) 持有对象 如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. Java中的库基本类型: List, Set, Queue和Map --- 称为集 ...

  4. 爬虫 http原理,梨视频,github登陆实例,requests请求参数小总结

    回顾:http协议基于请求响应的方式,请求:请求首行 请求头{'keys':vales} 请求体 :响应:响应首行,响应头{'keys':'vales'},响应体. import socket soc ...

  5. win10下caffe安装与mnist测试实验注意点

    caffe安装 安装内容:win10教育版+anaconda2+python(无gpu版本) 安装教程:主要依照三年一梦教程:https://www.cnblogs.com/king-lps/p/65 ...

  6. Revit二次开发 推荐

    学习revit二次开发,建议还是先把revit熟悉一下,去建立一下模型,亲自感受一下是如何创建模型的流程,其中会遇到什么问题.这样在自己做二次开发的时候,一些问题自己就能提前想到,规避掉.我大概用了半 ...

  7. 微信小程序rich-text 文本首行缩进和图片居中

    微信小程序开发使用rich-text组件渲染html格式的代码,常常因为不能自定义css导致文本不能缩进,以及图片不能居中等问题,这里可以考虑使用js的replace方法,替换字符串,然后在渲染的同时 ...

  8. c程序内存模型

    这篇文章主要记录一下c程序运行时内存空间如何使用.(摘抄自网络) 在一个多任务操作系统中的每个进程都运行在它自己的内存“沙箱”中.这个沙箱是一个虚拟地址空间(virtual address space ...

  9. Map,HashMap,LinkedHashMap,TreeMap比较和理解

    /* * 获取功能: * V get(Object key):根据键获取值 * Set<K> keySet():获取集合中所有键的集合 * Collection<V> valu ...

  10. Object.defineProperty()属性介绍

    对象是由多对key/value组成得无序集合,通过object.key=value来设置属性外,还可通过Object.defineProperty定义新属性或修改原有的属性. 语法:Object.de ...