在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要。 Go中的字符串和C#中的一样(java也是),字符串内容在初始化后不可修改。 需要注意的是在Go中字符串是有UTF-8编码的,请注意保存文件时将文件编码格式改成UTF-8(特别是在windows下)。

初始化

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

字符串操作

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

str :="laoYu老虞"

for  i:=;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:=;i<len(r) ; i++ {
fmt.Println("r[",i,"]=",r[i],"string=",string(r[i]))
} Outut: Unicode( ) string= l
Unicode( ) string= a
Unicode( ) string= o
Unicode( ) string= Y
Unicode( ) string= u
Unicode( ) string= 老
Unicode( ) string= 虞
rune= [ ]
r[ ]= string= l
r[ ]= string= a
r[ ]= string= o
r[ ]= string= Y
r[ ]= string= u
r[ ]= string= 老
r[ ]= 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队列中元素个数
package main
import "fmt"
func main() {
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]=",string(str[])) //l str_1 :="str"
arr :=[]int{,,}
slice :=make([]int,) m :=make(map[int] string)
m[]="len" ch :=make(chan int) fmt.Println("len(string)=",len(str_1)) //
fmt.Println("len(array)=",len(arr)) // fmt.Println("len(slice)=",len(slice)) //
fmt.Println("len(map)=",len(m)) //
fmt.Println("len(chat)=",len(ch)) // /*
type UserInfo struct {
id int
name string
}
user :=&UserInfo{id:1,name:"laoYu"}
*/
//interger :=2
//fmt.Println("len(my struct)=",len(user))// invalid argument interger (type int) for len
//fmt.Println("len(interger)=",len(interger))// invalid argument interger (type int) for len var str3 string
var arr2 []int
var slice2 []int
var m2 map[int] string
var ch2 chan int fmt.Println("len(string)=",len(str3)) //
fmt.Println("len(array)=",len(arr2)) //5
fmt.Println("len(slice)=",len(slice2)) //
fmt.Println("len(map)=",len(m2)) //
fmt.Println("len(chat)=",len(ch2)) //
}

字符串中是否包含某字符串 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) != -
}

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

package main
import (
"fmt"
"strings"
)
func main() {
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))

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

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

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

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

**使用(多个)空格分割字符串 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包下的字符串操作函数,请查看

Go语言 字符串的更多相关文章

  1. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  2. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

  3. C语言字符串长度(转)

    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...

  4. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  5. c语言字符串操作大全

     C语言字符串操作函数 函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #incl ...

  6. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  7. C 语言字符串连接的 3种方式

    C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...

  8. C语言字符串声明

    重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...

  9. C语言字符串操作函数整理

    整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...

  10. 13-C语言字符串函数库

    目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...

随机推荐

  1. http://jingyan.baidu.com/article/a3761b2b66fe141577f9aa51.html

    http://jingyan.baidu.com/article/a3761b2b66fe141577f9aa51.html

  2. SaaS系列介绍之五: 我国SaaS市场分析

    1 我国SaaS市场现状 我国SaaS从ASP年代发展到今天,也有不少时间了.我国是个十几亿人的大国,国情复杂,各地贫富不均,发展不平衡.信息系统建设也是各树一帜,各地为王.特别是占有大量用户的中小企 ...

  3. 【mysql的设计与优化专题(5)】慢查询详解

    查询mysql的操作信息 show status -- 显示全部mysql操作信息 show status like "com_insert%"; -- 获得mysql的插入次数; ...

  4. nyist 510昂贵的聘礼

    /* 好好的图论题啊,最短路的应用,dijkstra算法 */ #include <iostream> using namespace std; const int INF=100000; ...

  5. haproxy 规则匹配到了就停止,不会继续匹配下一个

    acl url_web_wwm path_beg -i /scan use_backend zjtest7_com if url_web_wwm acl url_static path_end .ht ...

  6. 关于ckeditor添加的class都会被清除掉的问题

    在源码中输入ul,并且带有class,然后点击源码,到可视化界面 结果显示为aaa,再点看源码,查看HTML源代码 解决方法: 添加配置 config.allowedContent = true 这个 ...

  7. SDOI2008Cave 洞穴勘测

    无限膜拜CLJ大牛…… 不会动态树的弱弱在CLJ的帮助下AC了此题 我想到了并查集(人人都会想到的吧……囧),但不知道应该如何处理destroy操作…… 其实 make操作的实质就是:把x节点到其所在 ...

  8. hibernate缓存:一级缓存和二级缓存

    1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在 ...

  9. Azure HDInsight与Hadoop周边系统集成

     Sunwei 9 Dec 2014 1:54 AM 传统的Hadoop系统提供给用户2个非常优秀的框架,MR计算框架和HDFS存储框架,尽管MR已经显得有些老迈而缓慢,但是HDFS还是很多应用系统的 ...

  10. MVC的EF编辑,不用查询直接修改

    EF中会为每个 管理的 实体对象 创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态: 一.通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值:实体对象被修改的属性 在 ...