绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
go语言中关于字符串使用的总结
2019-11-26 13:55:13

序语程言 



go语言标准库中对于字符串的操作很完善,以下简单总结一下字符串的操作

一、字符串只能用双引号定义

二、go里单引号和双引号不通过,可以使用`` 号来定义原始输出,不会进行转义,相当于python 里的三引号

package main

import "fmt"

func main() {

name := "杨彦星\n"

s := `杨

adgfgfg

\n\t

`

fmt.Println(name,s)

}

输出

杨彦星

adgfgfg

\n\t

三、字符串是不可改变的

我们说字符串是不可变的指的是字符串内部⽤用指针指向 UTF-8 字节数组,所指向的字节数组不能单独改变。并不是指字符串指向一个新的UTF-8数组

package main

import "fmt"

func main() {

var name string

var name1 = []byte("yangyanxing汉字")

name = string(name1)

fmt.Println(&name,name)

name = "杨彦星" //这个是可以的

fmt.Println(&name) //name 的地址不会改变

//非法

//name[0] = "a"

}

如果想要改变字符串中的值需要先将字符串转为字节数组([]byte)或者字符数组([]rune),有中文的情况下使用字符数组

package main

import "fmt"

func main() {

var name = "yangyanxing"

fmt.Println(&name,name)

names := []byte(name)

//字节数组需要使用单引号,双引号是字符串了

names[0] = 'f'

fmt.Println(&name,string(names))

name = "杨彦星" //这个是可以的

//如果有汉字的话需要使用字符数组

namer := []rune(name)

//需要使用单引号

namer[0] = '饭'

//name 的地址不会改变

fmt.Println(&name,string(namer))

}

四、字符串与字节数组与字符数组的相互转换

package main

import "fmt"

func main() {

var name = "yangyanxing"

fmt.Println(&name,name)

names := []byte(name)

fmt.Printf("%T\n",names)

names[0] = 'f' //字节数组需要使用单引号,双引号是字符串了

name = string(names)

fmt.Println(&name,name)

name = "杨彦星"

//如果有汉字的话需要使用字符数组

namer := []rune(name)

fmt.Printf("%T\n",namer)

namer[0] = '饭'

name = string(namer)

fmt.Println(&name,name) //name 的地址不会改变

}

五、字符串的遍历

字符串可以按字节或者字符来遍历

package main

import "fmt"

func main() {

var name = "yang杨彦星"

//按字节遍历

for i:=0;i

fmt.Printf("%v %T:%v\n",i,name[i],name[i])

}

fmt.Println("")

//按字符遍历

for _,r := range name{

//%c 为输出数值所表示的 Unicode 字符,不带单引号 如 y

//%q 输出数值所表示的 Unicode 字符(带单引号)如 '杨'

fmt.Printf("%c",r)

}

}

结果为

0 uint8:121

1 uint8:97

2 uint8:110

3 uint8:103

4 uint8:230

5 uint8:157

6 uint8:168

7 uint8:229

8 uint8:189

9 uint8:166

10 uint8:230

11 uint8:152

12 uint8:159

yang杨彦星

Process finished with exit code 0

六、字符串的拼接

可以直接使用 + 拼接

package main

import "fmt"

func main() {

//字符串可以使用+进行拼接

var name = "yang" + "yan" + "xing"

fmt.Println(name)

//使用+=在原字符串后面追加字符串

name += "杨彦星"

fmt.Println(name)

// + 不能在行首,只能写在行尾,就和if else中的else那样

s := "BeiJing" +

" TongZhou"

fmt.Println(s)

}

在循环中使用 + 号进行拼接并不是高效的方法,可以使用strings.Join方法

package main

import (

"fmt"

"strings"

)

func main() {

var names = []string{"yang","fan","zhang","li","chen"}

n := strings.Join(names," ")

fmt.Println(n)

s := "yang&aaa&bbb&ccc"

//以&分割

str := strings.Split(s,"&")

fmt.Println(str)

}

结果

yang fan zhang li chen

[yang aaa bbb ccc]

strings包的常用方法

该包提供了字符串操作的常用方法

package main

import (

"fmt"

"strings"

)

func main() {

s := "yang& yan&xing"

//HasPrefix 判断字符串 s 是否以 prefix 开头

fmt.Println(strings.HasPrefix(s,"y"))

//HasSuffix 判断字符串 s 是否以 suffix 结尾

fmt.Println(strings.HasSuffix(s,"aaa"))

//Contains 判断字符串 s 是否包含 substr

fmt.Println(strings.Contains(s,"yang"))

//Replace替换字符串,后一个参数为数量,-1为替换全部

fmt.Println(strings.Replace(s,"y","Y",-1))

//ToLower 将字符串中的 Unicode 字符全部转换为相应的小写字符

ss := "AAA杨彦星BbbbB"

fmt.Println(strings.ToLower(ss))

//ToUpper 将字符串中的 Unicode 字符全部转换为相应的大写字符

fmt.Println(strings.ToUpper(ss))

//strings.TrimSpace(s) 来剔除字符串开头和结尾的空白符号

//中间的不能删除

sp := " aaa bbb ccc "

fmt.Println(strings.TrimSpace(sp))

//还可以去除开头或者结尾指定的字符

ssp := "aaa Hey, how are you George?aaaa"

fmt.Println(strings.TrimLeft(ssp,"He"))

fmt.Println(strings.TrimRight(ssp,"ge"))

fmt.Println(strings.Trim(ssp,"aaa"))

//strings.Fields(s) 将会利用

//strings.Split(s, sep) 用于自定义分割符号来对指定字符串进行分割

sp2 := " aa a b bb ccc "

fmt.Println(strings.Fields(sp2))

fmt.Println(strings.Split(sp2," ")) //使用空格分割

//Join 用于将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串

sp3 := []string{"aa","a","b","bb","ccc"}

fmt.Println(strings.Join(sp3,"%%%"))

}

结果

true

false

true

Yang& Yan&xing

aaa杨彦星bbbbb

AAA杨彦星BBBBB

aaa bbb ccc

aaa Hey, how are you George?aaaa

aaa Hey, how are you George?aaaa

Hey, how are you George?

[aa a b bb ccc]

[ aa a b bb ccc ]

aa%%%a%%%b%%%bb%%%ccc

字符串与其它类型的转换

使用strconv包中的方法可以实现字符串与其它类型的转换

package main

import (

"fmt"

"strconv"

)

func main() {

//Itoa 将数字转为字符串

fmt.Println(strconv.Itoa(35))

// Atoi 将字符串转为其它类型并不一定会成功

fmt.Println(strconv.Atoi("100"))

fmt.Println(strconv.ParseBool("true")) //可以成功

v,e := strconv.ParseBool("trues")//会有err

if e!=nil{

fmt.Println(e.Error())

}else{

fmt.Println(v)

}

}

分享好友

分享这个小栈给你的朋友们,一起进步吧。

华山论剑
创建时间:2019-02-22 18:53:00
没了烟火气,人生就是一段孤独的旅程·····于是,在ITPUB,我们以武论英雄!
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 栈栈
    栈主
  • ?
    嘉宾

小栈成员

查看更多
  • u_9a3ed7a37f8e4a
  • daisyplay
  • boss_ch
  • Jack2k
戳我,来吐槽~