初始化

var str string //声明一个字符串
str = "laoYu" //赋值
ch :=str[0] //获取第一个字符
len :=len(str) //字符串的长度,len是内置函数 ,len=5

字符串操作

编码过程中避免不了中文字符,那我们该如何提取一个中文呢?首先我们要知道string[index]获取的是字符byte,就无法像C#中"老虞"[0]来取到‘老’,在Go中需要将字符串转换成rune数组,runne数组中就可以通过数组下标获取一个汉字所标识的Unicode码,再将Unicode码按创建成字符串即可。

查看示例代码

str :="laoYu老虞"

for  i:=0;i<len(str);i++ {
fmt.Println(str[i])
} for i,s := range str {
fmt.Println(i,"Unicode(",s,") string=",string(s))
} r := []rune(str)
fmt.Println("rune=",r)
for i:=0;i<len(r) ; i++ {
fmt.Println("r[",i,"]=",r[i],"string=",string(r[i]))
} Outut:
108
97
111
89
117
232
128
129
232
153
158
0 Unicode( 108 ) string= l
1 Unicode( 97 ) string= a
2 Unicode( 111 ) string= o
3 Unicode( 89 ) string= Y
4 Unicode( 117 ) string= u
5 Unicode( 32769 ) string= 老
8 Unicode( 34398 ) string= 虞
rune= [108 97 111 89 117 32769 34398]
r[ 0 ]= 108 string= l
r[ 1 ]= 97 string= a
r[ 2 ]= 111 string= o
r[ 3 ]= 89 string= Y
r[ 4 ]= 117 string= u
r[ 5 ]= 32769 string= 老
r[ 6 ]= 34398 string= 虞

对字符串的操作非常重要,来了解下strings包中提供了哪些函数

获取总字节数 func Len(v type) int

len函数是Go中内置函数,不引入strings包即可使用。len(string)返回的是字符串的字节数。len函数所支持的入参类型如下:

  • len(Array) 数组的元素个数
  • len(*Array) 数组指针中的元素个数,如果入参为nil则返回0
  • len(Slice) 数组切片中元素个数,如果入参为nil则返回0
  • len(map) 字典中元素个数,如果入参为nil则返回0
  • len(Channel) Channel buffer队列中元素个数

查看示例代码

str :="laoYu老虞"
str2 :="laoYu"
fmt.Println("len(",str,")=",len(str)) //len=11=5+6,一个汉字在UTF-8>中占3个字节
fmt.Println("len(",str2,")=",len(str2)) //len=5
fmt.Println("str[0]=",str[0]) //l str :="str"
arr :=[5]int{1,2,3}
slice :=make([]int,5) m :=make(map[int] string)
m[2]="len" ch :=make(chan int) fmt.Println("len(string)=",len(str)) //3
fmt.Println("len(array)=",len(arr)) //5invalid argument user (type *UserInfo) for len fmt.Println("len(slice)=",len(slice)) //5
fmt.Println("len(map)=",len(m)) //1
fmt.Println("len(chat)=",len(ch)) //0 //user :=&UserInfo{id:1,name:"laoYu"}
//interger :=2
//fmt.Println("len(my struct)=",len(user))//invalid argument user (type *UserInfo) for len
//fmt.Println("len(interger)=",len(interger)) var str2 string
var arr2 [5]int
var slice2 []int
var m2 map[int] string
var ch2 chan int fmt.Println("len(string)=",len(str2)) //0
fmt.Println("len(array)=",len(arr2)) //5
fmt.Println("len(slice)=",len(slice2)) //0
fmt.Println("len(map)=",len(m2)) //0
fmt.Println("len(chat)=",len(ch2)) //0

字符串中是否包含某字符串 func Contains(s, substr string) bool

确定是否包含某字符串,这是区分大小写的。实际上内部是通过Index(s,sub string) int 实现的。如果索引!=-1则表示包含该字符串。空字符串""在任何字符串中均存在。

源代码

// Contains returns true if substr is within s.
func Contains(s, substr string) bool {
return Index(s, substr) != -1
}

**示例,使用请需导入包:' import "strings" ' **

查看示例代码

str :="laoYuStudyGotrue是否包含某字符串"
fmt.Println(strings.Contains(str,"go")) //false
fmt.Println(strings.Contains(str,"Go")) //true
fmt.Println(strings.Contains(str,"laoyu")) //false
fmt.Println(strings.Contains(str,"是")) //true
fmt.Println(strings.Contains(str,"")) //true

在实际工作中常需要在不区分大小写的情况下确认是否包含某字符串,(我们应该减少这种情况,以免每次验证时都需要进行一次大小写转换)。 这里我局部修改源代码提供一个验证字符串中是否包含某字符串的函数,当然你也可以直接使用strings.Contains(strings.ToLower(s),strings.ToLower(substr))

str := "laoYuStudyGotrue是否包含某字符串"
fmt.Println(Contains(str, "go", true)) //true
fmt.Println(Contains(str,"go",false)) //false

    //在字符串s中是否包含字符串substr,ignoreCase表示是否忽略大小写
func Contains(s string, substr string, ignoreCase bool) bool {
return Index(s, substr, ignoreCase) != -1 } //字符串subst在字符串s中的索引位置,ignoreCase表示是否忽略大小写
func Index(s string, sep string, ignoreCase bool) int { n := len(sep)
if n == 0 {
return 0
} //to Lower
if ignoreCase == true {
s = strings.ToLower(s)
sep = strings.ToLower(sep)
} c := sep[0]
if n == 1 {
// special case worth making fast
for i := 0; i < len(s); i++ {
if s[i] == c {
return i
}
}
return -1
}
// n > 1
for i := 0; i+n <= len(s); i++ {
if s[i] == c && s[i:i+n] == sep {
return i
}
}
return -1
}

获取字符串sep在字符串s中出现的次数 Count(s,sep string)

注意:如果sep="",则无论s为何字符串都会返回 len(s)+1

查看示例代码

fmt.Println(strings.Count("laoYuStudyGo", "o"))                 //2
fmt.Println(strings.Count("laoYuStudyGo", "O")) //0
fmt.Println(strings.Count("laoYuStudyGo", "")) //13=12+1
fmt.Println(strings.Count("laoYuStudyGo老虞学习Go语言", "虞")) //1
fmt.Println(strings.Count("laoYuStudyGo老虞学习Go语言", "Go")) //2
fmt.Println(strings.Count("laoYuStudyGo老虞学习Go语言", "老虞"))//1
fmt.Println(strings.Count("", "")) //1=0+1
fmt.Println(strings.Count("aaaaaaaa","aa")) //4
fmt.Println(strings.Count("laoYuStudyGo_n","\n")) //0

**使用(多个)空格分割字符串 Fields(s string) ,返回分割后的数组 **

将字符串分割成数组,其分割符为空格。

查看示例代码

fmt.Println(strings.Fields("lao Yu Study Go ")) //OutPut: [lao Yu Study Go]
fmt.Println(strings.Fields(" Go ")) //[Go]
fmt.Println(strings.Fields("")) //[]
fmt.Println(strings.Fields(" \n go")) //[go]

**其实其内部实现调用的是FieldsFunc(s,unicode.IsSpace),我们也可以自定义分割方式 **

canSplit := func (c rune)  bool { return c=='#'}
fmt.Println(strings.FieldsFunc("lao###Yu#Study####Go#G ",canSplit)) //[lao Yu Study Go G<space>]

检查字符串是否已某字符串开头 HasPrefix(s,prefix string) bool

如果想查看更多关于strings包下的字符串操作函数,请查看

阅读原文

GoLang-字符串的更多相关文章

  1. GO语言的进阶之路-Golang字符串处理以及文件操作

    GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...

  2. Golang 字符串转URLCode

    Golang 字符串转URLCode 最近因调用gitlab API,在生成某些字符串的时候直接请求 gitlab API 失败, url如下: keysURL := "http://192 ...

  3. [转] golang 字符串比较是否相等

    1 前言 strings.EqualFold不区分大小写,"==" 区分且直观. 2 代码 golang字符串比较的三种常见方法 fmt.Println("go" ...

  4. [Golang]字符串拼接方式的性能分析

    本文100%由本人(Haoxiang Ma)原创,如需转载请注明出处. 本文写于2019/02/16,基于Go 1.11.至于其他版本的Go SDK,如有出入请自行查阅其他资料. Overview 写 ...

  5. Golang字符串函数认识(二)

    package main import ( "fmt" "strings" ) func main(){ //返回字符在指定字符串中最后一次出现的位置 last ...

  6. Golang字符串函数认识(一)

    package main import ( "fmt" "strings" "strconv" ) func main(){ //返回字符串 ...

  7. golang 字符串统计

    golang内建只认utf8 如果传递的字符串里含有汉字什么的,最好使用 utf8.RuneCountInString() 统计 字符串统计几种方法: - 使用 bytes.Count() 统计- 使 ...

  8. golang 字符串截取

    java中有SubString,那golang怎么截取字符串? str := "hello world" fmt.Print(str[:]) 以上代码输出 hello 数组,sli ...

  9. golang -- 字符串就地取反

    字符串 定义 在golang中字符串是一种不可变的字节序列,它可以包含任意的数据,包括0值字节,但主要是人类可以阅读的文本.golang中默认字符串被解读为utf-8编码的Unicode码点(文字符号 ...

  10. golang 字符串与整数, 布尔转换 strconv

    strconv 是golang对于字符串和基本数据类型之间的转换字符串转整数testStr := "1000" testInt, err := strconv.Atoi(testS ...

随机推荐

  1. excel如何快速实现数据区域的框选

    这里会存在2个情况,一个是快速的选择一行或者一列的数据,另外一个是快速的选择一块的数据(数据区域) 1.当有上万条数据时,怎么快速的选择一行或一列的数据? 方法:将鼠标放在需要选择的数据区域的开头位置 ...

  2. django之创建第3个项目:编写第一个模板文件

    1.django结构 2.在站点blog下创建templates文件夹,专门用于存放模板文件 3.在templates文件夹下创建index.html文件 #index.html <!DOCTY ...

  3. mysql字符生命周期

    mysql的字符集,对数据的导入导出很关键,明白自己集在不同阶段不同场景下的意义即为重要! 01.查看mysql当前字符集 show variables like '%cahr%'; 02.用户请求m ...

  4. Spring Boot 使用Jar打包发布, 并使用 Embedded Jetty/Tomcat 容器

    Jar包发布 在项目pom.xml中, 如果继承了Spring Boot的starter parent, 那么默认已经包含打包需要的plugins了, 设置为jar就能直接打包成包含依赖的可执行的ja ...

  5. 简单原始的ASP.NET WEBFORM中多文件上传【参考其他资料修改】

    首先是ASPX页面中添加file标签 <input onclick="addFile()" type="button" value="增加&qu ...

  6. ios中自定义图层的2种方法

    1:自定义图层,在图层中画图 #import <QuartzCore/QuartzCore.h> @interface MJLayer : CALayer @end #import &qu ...

  7. ios中键盘处理源码

      1:先分别设置各个文本框的键盘类型(inputview)-->在特定键盘中textediting中禁用输入. 2:然后递归绑定各个键盘的工具条(inputaccessview).并且个各个控 ...

  8. Emacs中Golang的设置

    欲善其事,先利其器.下面记录一些使用Emacs24做golang开发中的一些有用设置,备忘用. 一,golang中的代码跳转 emacs24的go-mode中默认用godef-describe,god ...

  9. windows 7 提示缺少D3DCOMPILER_47.dll的正确解决方法

    下载 KB4019990补丁 我上传一下吧. 点击下载

  10. linux命令大全之watch命令详解(监测命令运行结果)

    watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...