开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情
今天来学习下Go常见的习题问题(三十二),也是面试中可能会遇到的,让我们来一起学习吧~
new 和 make的区别
- make 仅用来分配以及初始化
slice、map、chan类型的数据make(slice,len,cap)make(map[string]string,len)make(chan int,len) - new 可分配任意类型的数据,根据传入的类型申请一块内存,返回指向这块内存的指针,即类型
*Type,返回一个指针,该指针指向新分配类型的零值,可以用于值类型,数组、结构体。 - make 返回引用,即 Type,new 分配的空间被清零, make 分配空间后,会进行初始化,返回初始化后T的引用
字符串拼接
用go语言实现字符串拼接有五种实现方式:
- 使用
+
func Concat1(n int, str string) string {
s := ""
for i := 0; i < n; i++ {
s += str
}
return s
}
- 使用
fmt.Sprintf
func Concat2(n int, str string) string {
s := ""
for i := 0; i < n; i++ {
s = fmt.Sprintf("%s%s", s, str)
}
return s
}
- 使用
strings.Builder
func Concat3(n int, str string) string{
var s strings.Builder
for i := 0; i < n; i++ {
s.WriteString(str)
}
return s.String()
}
- 使用
bytes.Buffer
func Concat4(n int, s string) string {
buf := new(bytes.Buffer)
for i := 0; i < n; i++ {
buf.WriteString(s)
}
return buf.String()
}
- 使用
[]byte
func Concat5(n int, str string) string {
buf := make([]byte, 0)
for i := 0; i < n; i++ {
buf = append(buf, str...)
}
return string(buf)
}
func Concat6(n int, str string) string {
buf := make([]byte, 0, n*len(str))
for i := 0; i < n; i++ {
buf = append(buf, str...)
}
return string(buf)
}
上面的五种方法,使用 + 和 fmt.Sprintf 的效率是最低的,并且 fmt.Sprintf 通常是用来格式化字符串的,很少会用来拼接字符串
strings.Builder、bytes.Buffer 和 []byte 的效率差不多,消耗内存也比较接近,性能最好且消耗内存最小的是 Concat6(),这个方式预分配了内存,在字符串拼接的过程中,不需要进行字符串的拷贝,也不需要分配新的内存
总结
今天浅谈了Go的习题(三十二),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!