【GoLang】3.1 字符串


  学习Go字符串的时候,我想起我Python字符串还有一大堆API没学呢。不过那个以后再学吧,先把GoLang的学习进度往前推。GoLang的字符串API肯定是没有Python丰富的,但是主要的功能肯定还是有的。我主要就索引、长度、搜索、大小写、拼接、替换、分割这7部分进行学习。并在最后补上多行字符串语法和string的底层结构。

长度和索引

  获取长度和按索引取字符,这是最基本的吧。但是GoLang通过索引取到的,直接输出会是一个rune,需要用%c进行格式化输出,如下例:

package main

import "fmt"

func main() {
	s := "a first glimpse of"
	fmt.Println(len(s))
	fmt.Printf("%c\n", s[4])
}

  输出:

18
r 

切片

  这个语法点算是重复学习了,因为python我学了一遍,在GoLang又学习一遍。不同于python的是,GoLang切片不能为负数,那么切片就不过四种嘛:

package main

import "fmt"

func main() {
	s := "a first glimpse of"
	fmt.Println(s[8:])
	fmt.Println(s[:15])
	fmt.Println(s[8:15])
	fmt.Println(s[:])
}

  输出:

glimpse of
a first glimpse   
glimpse           
a first glimpse of

搜索

  GoLang有个strings包,里面有很多操作处理string的api,而搜索定位索引的API就在其中,如:

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "Yellow, and black, and pale, and hectic red"
	index := strings.Index(s, "black")
	fmt.Println(index)
}

  输出:

12

大小写

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "The winged seeds, where they lie cold and low"
	upper := strings.ToUpper(s)
	fmt.Println(upper)
	fmt.Println(strings.ToLower(upper))
}

  输出:

THE WINGED SEEDS, WHERE THEY LIE COLD AND LOW
the winged seeds, where they lie cold and low

拼接

  与Java/Python一样,GoLang的字符串拼接也是加号(+),不过只能用于字符串之间的拼接,而Java可以拼接字符串与非字符串:

package main

import "fmt"

func main() {
	s := "Ashes and sparks," + " my words among mankind!"
	fmt.Println(s)
}

  输出:

Ashes and sparks, my words among mankind!

替换

  这个API同样来自strings包。该函数签名为:func Replace(s, old, new string, n int) string。最后一个参数,是替换的数量,如果为-1则是全部退换:

package main

import (
	"fmt"
	"strings"
)

func main() {
	fmt.Println(strings.Replace("123223", "2", "*", -1))
	fmt.Println(strings.Replace("123223", "2", "*", 2))
}

  最后一个参数的作用很快就体现了,一个是全部替换,一个是只替换了两个:

1*3**3
1*3*23

分割修剪

  这种经常出现在平时的业务开发中,很多人喜欢逗号拼接参数。殊不知,如果被分割的部分有逗号呢?那就是个bug了,闲话不说了,抓紧时间练习API。而GoLang的修剪是需要指定是空格还是其他符号,怎么说呢?更加灵活吧。

package main

import (
	"fmt"
	"strings"
)

func main() {
	split := strings.Split("A shrivelled, lifeless, vacant form", ",")
	for _, s := range split {
		fmt.Println(strings.Trim(s, " "))
	}
}

  输出:

A shrivelled
lifeless    
vacant form 

多行字符串

  和python一样,GoLang也是支持多行字符串的,同样要注意多行字符串不能缩进,必须保持原样。如下面的例子(朗费罗的诗歌):

package main

import "fmt"

func main() {
	s := `I shot an arrow into the air,
It fell to earth, I knew not where;
For, so swiftly it flew, the sight
Could not follow it in its flight.
`
	fmt.Println(s)
}

  输出结果如下:

I shot an arrow into the air,
It fell to earth, I knew not where;
For, so swiftly it flew, the sight
Could not follow it in its flight.

内部结构

  说了这么多API,该了解下底层原理了,在GoLand中可以看Go的SDK,如下图:
在这里插入图片描述
  在src下找到reflect/value.go,如图:
在这里插入图片描述
  在2664行,可以看到string的运行时类型:

// StringHeader is the runtime representation of a string.
// It cannot be used safely or portably and its representation may
// change in a later release.
// Moreover, the Data field is not sufficient to guarantee the data
// it references will not be garbage collected, so programs must keep
// a separate, correctly typed pointer to the underlying data.
type StringHeader struct {
	Data uintptr
	Len  int
}

  从代码看string是和其他大多数编程语言一样,是不可变类型,底层是数据数组Data加长度字段Len。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值