字典、 字符串
字典在C++里对应的是map类型。定义格式如下:
var m1 map[string]int
map是动态增长的。不能使用不能比较的元素作为字典的key。
字典的相关操作:
放值:
m3[“key1”] = “v1”
计算长度:
len(m3)
遍历:
for key, value := range m3 {
fmt.Println("key: ", key, " value: ", value)
}
删除:
delete(m3, “key1”)
我们还可以把函数作为值类型存入字典中:
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))
}
字符串
字符串是一种值类型,在创建字符串后其值是不可变的。
go里面的字符串修改很麻烦:可以将其转换为字节切片,再将其转换为字符串,但是也同样需要重新分配内存。
strconv
实现了基本类型与字符串之间的转换:
i, err := strconv.Atoi("-42") //将字符串转为int类型
s := strconv.Itoa(-42) //将int类型转为字符串
字符串拼接:
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()
}
2.+拼接
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()
}
3.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.strings.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()
}
go的语法是真的奇怪 读不通!