Go字符串操作和几种输入输出
计算字符串长度
str1:="woaixiaohuanng"
str2:="我爱小黄"
fmt.Println(len(str1)) //len是Go语言的内置函数,可以获取string、slice、chan、map等类型的长度
fmt.Println(len(str2)) //输出12 因为Go使用UTF-8格式保存字符串,所以一个中文占用三个字节(还有一些生僻的汉字是占用四个字节的)
//在复杂的字符串中,我们该如何准确知道有多少个中文字符呢?
fmt.Println(utf8.RuneCountInString(str1))
fmt.Println(utf8.RuneCountInString(str2)) //输出4 UTF-8包中的RuneCoutInString函数采用的是Unicode编码,将中文视作一个字节
//总结: ASCII字符串使用len 计算长度
//Unicode字符串使用RuneCountInString
字符串的遍历
str1:="xiaohuangzuikeai"
str2:="小黄坠可爱"
for i:=0;i<len(str1);i++{
fmt.Printf("%c ",str1[i])
}
fmt.Println()
for _,s:=range str2{
fmt.Printf("%c",s)
}
//总结:遍历ASCII 字符串,通过下标直接遍历
//遍历Unicode 字符串,通过for range进行遍历
搜索子串
str1:="小黄大笨蛋,eieiei,heiheihei"
k1:=strings.Index(str1,",") //搜索第一次出现,的位置
k2:=strings.LastIndex(str1,",")//反向搜索
fmt.Println(str1[k1:])
fmt.Println(str1[k2:])
//总结: strings.Index正向搜索子字符串
//strings.LastIndex反向搜索子字符串
修改字符串
//Go无法直接修改字符串,所以我们只能通过创建一个新的字符串并赋值给原来的字符串实现字符串的修改
str1:="huangxincishidashabi,xiaochengshidashuaibi"
k:=strings.Index(str1,",")
str2:=[]byte(str1)
for j,i:=0,k;i<len(str1);i++{
str2[j]=str1[i]
j++
}
/*fmt.Println(string(str2))
for j:=0;j<len(str1);j++{
str1[j]=" "//cannot assign to str1[j] (strings are immutable)
} */
连接字符串
str1:="xiaochenghaoshuai"
str2:="xiaohuanghaomei"
str3:=str1+str2
fmt.Println(str3)
var strbuf bytes.Buffer //使用缓冲
strbuf.WriteString(str1) //把字符串写进缓冲中
strbuf.WriteString(str2)
fmt.Println(strbuf.String()) //缓冲的String()方法将缓冲转化为字符串
//总结: + 是连接字符串最简单的操作 但并不高效
//我们可以用bytes包里的缓冲实现字符串的连接
格式化输出
| %v | 按值的本来值输出 |
|---|---|
| %+v | 在%v基础上,对结构体字段名和值进行展开 |
| %#v | 输出Go语法格式的值 |
| %T | 输出Go语法格式的类型和值 |
| %% | 输出% |
| %b | 整型以二进制方式显示 |
| %o | 整型以八进制方式显示 |
| %d | 整型以十进制方式显示 |
| %x | 整型以十六进制方式显示 |
| %U | Unicode字符 |
| %f | 浮点数 |
| %p | 指针,十六进制方式显示 |
fmt包中的三种输入方式和输出方式
func Print(a ... interface{}) (n int,err error) //打印
func Printf(format string,a...interface{}) (n int,err error) //格式化打印
func Println(a... interface{}) (n int,err error) //打印后换行 其中n是打印出的字节数
func Scan(a...interface{}) (n int,err error) //读到全读进去为止 如果输入的有错误返回已经读对了的个数
func Scanf(format string,a...interface{}) (n int ,err error) //读到换行为止,Go中的字符串读入也是要取地址的&
func Scanln(a... interface{}) (n int,err error) //和Scan一样 不过是读到回车为止 n是读取的个数
bufio包读取
bufio官方文档:
因为没有一种方式能够读有空格的字符串 所以我们还需要了解一下bufio包的读取
fmt.Println("请输入一个字符串:")
reader := bufio.NewReader(os.Stdin)
s1, _ := reader.ReadString('\n')
fmt.Println("读到的数据:", s1)

浙公网安备 33010602011771号