TASK05:字典、字符串

字典

map:一种键值对结构,通过给定的key可以快速获得对应的value

如何定义字典

var m1 map[string]int
m2:= make(map[int]interface{},100)
m3:= map[string]string{
		"name":"james",
		"age":"35"
}

在定义字典时不需要为其指定容量,因为map是可以动态增长的,但是在可以预知map容量的情况下为了提高程序的效率也最好提前标明程序的容量。

不能使用不能比较的元素作为字典的key,例如数组,切片等。

value可以是任意类型的,如果使用interface{}作为value类型,那么就可以接受各种类型的值,只不过在具体使用的时候需要使用类型断言来判断类型。

字典操作

  1. 向字典放入元素
m3["key1"] = "v1"
m3["key2"] = "v2"
m3["key3"] = "v3"
  1. 获取字典的长度
len(m3)
  1. 判断键值对是否存在/当前value存储的是否就是空值
if value, ok := m3["name"]; ok {
		fmt.Println(value)
	}
//如果当前字典中存在key为name的字符串则取出对应的value,并返回true,否则返回false。
  1. 已存在字典对其遍历
for key,value := range m3 {
				fmt.Println("key:",key,"value:",value)
				}

对于一个字典来说其默认是无序的.

  1. 删除字典中的值
delete(m3,"key1")
  1. 将函数作为值类型存入到字典中
func main() {
		m:=make(map[string]func(a,b int) int)
		m["add"] = func(a,b int) int {
					return a + b
		}
		m["multi"] = func(a,b int) int {
					return a * b
		}
		fmt.Println(m["add"](3,2))
		fmt.Println(m["multi"](3,2))
}

字符串

字符串定义

字符串是一种值类型,在创建字符串之后其值是不可变的

如果我们想要修改一个字符串的内容,我们可以将其转换为字节切片,再将其转换为字符串,但是也同样需要重新分配内存

func main() {
			s:= "hello"
			b:=[]byte(s)
			b[0]='g'
			s = string(b)
			fmt.Println(s)
}

//通过len函数来获取字符串长度
len(s) 

//如果字符串中包含中文就不能直接使用byte切片对其进行操作,go语言中我们可以通过这种方式
func main() {
			s := "hello你好中国"
			fmt.Println(len(s))
			fmt.Println(utf8.RuneCountInString(s))
			b:= []byte(s)
			for i:= 0 ; i< len(b); i++ {
					fmt.Printf("%c",b[i])
			}
			fmt.Println()
			
			r := []rune(s)
			for i := 0, i < len(r);i++ {
						fmt.Printf("%c",r[i])
			}

在go语言中字符串都是以utf-8的编码格式进行存储的,所以每个中文占三个字节加上hello的5个字节所以长度为17,如果我们通过utf8.RuneCountInString函数获得的包含中文的字符串长度则与我们的直觉相符合。而且由于中文对于每个单独的字节来说是不可打印的,所以可以看到很多奇怪的输出,但是将字符串转为rune切片则没有问题。

string包

strings包提供了许多操作字符串的函数。在这里你可以看到都包含哪些函数。

strconv包

strconv包实现了基本数据类型与字符串之间的转换。在这里你可以看到都包含哪些函数。

字符串拼接

  1. SPrintf
const numbers = 100

func BenchmarkSprintf(b *testing.B) {
	b.ResetTimer()
	for idx := 0; idx < b.N; idx++ {
		var s string
		for i := 0; i < numbers; i++ {
			s = fmt.Sprintf("%v%v", s, i)
		}
	}
	b.StopTimer()
}
  1. +拼接
func BenchmarkStringAdd(b *testing.B) {
	b.ResetTimer()
	for idx := 0; idx < b.N; idx++ {
		var s string
		for i := 0; i < numbers; i++ {
			s += strconv.Itoa(i)
		}
	}
	b.StopTimer()
}
  1. bytes.Buffer
func BenchmarkBytesBuf(b *testing.B) {
	b.ResetTimer()
	for idx := 0; idx < b.N; idx++ {
		var buf bytes.Buffer
		for i := 0; i < numbers; i++ {
			buf.WriteString(strconv.Itoa(i))
		}
		_ = buf.String()
	}
	b.StopTimer()
}

4. string.Builder拼接(最高效)

func BenchmarkStringBuilder(b *testing.B) {
	b.ResetTimer()
	for idx := 0; idx < b.N; idx++ {
		var builder strings.Builder
		for i := 0; i < numbers; i++ {
			builder.WriteString(strconv.Itoa(i))
		}
		_ = builder.String()
	}
	b.StopTimer()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值