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"))
	
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                          

 

 

posted @ 2019-10-17 21:36  心碎人俱乐部  阅读(7)  评论(0)    收藏  举报