Golang | 第一章 | 4.字符串应用
字符串的应用最为广泛,用法如下:
1.计算长度
对ASCII字符串:
fmt.Println(len(str))
对中文,由于UTF-8格式中每个汉字(以及中文标点符号)占3个字节,不能直接用len(),要使用
"unicode/utf8"包
var str ="一二 456"
fmt.Println(utf8.RuneCountInString(str))
out:
6
2.遍历
对英文字符(ASCII)直接遍历,对含有中文的字符要用for range
ste:="逃逸 fyui"
for _,s:=range ste{
fmt.Printf("Unicode: %c %d\n",s,s)
//range将返回index和value两个变量。不需要使用该元素的序号时,使用空白符"_"省略。
}
注意两个格式化动词 %c 和 %d:
- %c 表示输出当前Unicode码对应的值
- %d以十进制输出Unicode码的序号
输出为
Unicode: 逃 36867
Unicode: 逸 36920
Unicode: 32
Unicode: f 102
Unicode: y 121
Unicode: u 117
Unicode: i 105
3.截取子串
通过strings包里的Index函数获得字符下标
ste:="逃逸 fyui"
space:=strings.Index(ste," ")//在ste中查找空格的下标
fmt.Println(space,ste[space+1:])//+1为了去掉空格
out:
fuyi
4.修改字符串
字符串是只读的,转换为[]byte类型后可修改,[]byte本身是切片类型
func main() {
ste:="012三45"
stebyte:=[]byte(ste)//类型转换
for i:=3;i<=5;i++{ //汉字占3~5三个字节位
stebyte[i]='3'
}
fmt.Print(string(stebyte))//这里新建了一个字符串
}
out:
01233345
5.字符串的连接
可以通过 "+"连接,但有效率更高的方式,使用StringBuilder的机制
s1:="123";s2:="456";s3:="789"
var StringBuilder bytes.Buffer
StringBuilder.WriteString(s1)
StringBuilder.WriteString(s2)
StringBuilder.WriteString(s3)
fmt.Println(StringBuilder.String())
OUT:
123456789
※6.格式化
格式化动词用于字符串的显示,只用于字符串的输出,只存在于printf()里的双引号" "内
注意动词个数==参数个数,一一对应
- %v输出变量值
s1:="一";s2:="二三";s3:=四五"
fmt.Printf("%v去%v里,烟村%v家",s1,s2,s3)
//%v要求输出变量的值
out:一去二三里,烟村四五家
- %b 、 %d 、 %x输出整型的不同进制
//%x要求整型变量输出十进制
s1:=1;s2:=23;s3:=45
fmt.Printf("%d去%d里,烟村%d家",s1,s2,s3)
out:
1去23里,烟村45家
//%x要求整型变量输出16进制
out:
1去17里,烟村2d家
//%b要求整型变量输出2进制
out:
1去10111里,烟村101101家
- %T输出变量的类型
s1:="1";s2:="23";s3:=45
fmt.Printf("%T去%T里,烟村%T家",s1,s2,s3)
out:
string去string里,烟村int家
7.base64编码
message:="人人"
EncodeMessage:=base64.StdEncoding.EncodeToString([]byte(message))
//标准编码方法
fmt.Println(EncodeMessage)
data,err:=base64.StdEncoding.DecodeString(EncodeMessage)
if err!=nil{
fmt.Println(err)
} else {
fmt.Println(string(data))
}
8.ini文件应用
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func getValue(filename,expectSection,expectKey string)string {
//读取文件部分
file,err:=os.Open(filename)
if err!=nil{
return ""
}
defer file.Close() //defer表示不是在本行,而是当前函数生命周期结束时执行
//等价于将file.Close()挪到函数体最后
//读取行
reader:=bufio.NewReader(file)
var sectionName string
for{
//读取一行
linestr,err:=reader.ReadString('\n')
if err!=nil{
break
}
linestr=strings.TrimSpace(linestr) //切掉左右两边的空格
//忽略空行
if linestr==""{
continue
}
//忽略注释
if linestr[0]==';'{ //字符就一定得单引号
continue;
}
//读取段
if linestr[0]=='[' && linestr[len(linestr)]==']'{
sectionName=linestr[1:len(linestr)-1]
} else if sectionName==expectSection{
//将字符串一分为二
pair:=strings.Split(linestr,"=") //但strings包里的函数必须用双引号
//pair的len长度是linestr被分的份数
if(len(pair))==2{
key:=strings.TrimSpace(pair[0])
if key==expectKey{
//返回键值
return strings.TrimSpace(pair[1])
}
}
}
}
return ""
}
func main() {
//fmt.Println(getValue("example.ini", "remote \"origin\"", "fetch"))
}

浙公网安备 33010602011771号