Go的字符串
Go 语言的字符串处理是开发中非常常见的任务,正确地使用字符串可以提高代码的可读性和性能。下面是学习过程中我觉得的注意事项
- 使用反引号创建原始字符串 如果字符串中包含多行文本或特殊字符,可以使用反引号` `来创建原始字符串,它可以保持原始文本格式,不需要转义特殊字符。
- Go 语言中,可以使用
+号来连接字符串。但在大量字符串连接时,使用strings.Builder类型,可以提高字符串连接的性能。当需要将多个字符串连接成一个字符串时,也可以使用strings.Join函数,它比使用+运算符效率更高。 - 在 Go 中,字符串是不可变的,不能像数组一样直接修改字符串的某个字符。
可以先将其转换为
[]byte类型,然后再进行修改。但是转换后的新切片会拷贝原始字符串的内容。
Go的切片(Slice)
Go 语言的slice 是一个非常强大且灵活的数据结构,类似于java的ArryList,允许我们动态地管理和操作数组。
- 当多个切片共享同一个底层数组时,其中一个切片的修改可能会影响其他切片的值。为了避免这种情况,可以使用
copy函数创建一个新的切片,这样它就不再共享底层数组。 - 在使用
for循环遍历切片时,不要在迭代过程中修改切片的长度,因为这可能会导致意外的结果或死循环。如果需要修改切片,可以在循环外部进行操作,或者使用新的切片来保存修改后的数据。 - 在知道大小的情况下,指定slice的长度,可以避免多次内存分配。
Goroutine
Go 语言的 goroutine 是一种轻量级的并发机制,它可以在单个程序中同时执行多个任务,大大提高程序的并发性能。
- 在使用
goroutine时,需要确保所有的goroutine在执行完成后能够正常退出。如果其中某个一直运行而没有退出,会造成泄露,最终导致程序崩溃。因此,在使用goroutine时需要确保正确的关闭或终止。
func makeThumbnails6(filenames <-chan string) int64 {
sizes := make(chan int64)
var wg sync.WaitGroup // number of working goroutines
for f := range filenames {
wg.Add(1)
// worker
go func(f string) {
defer wg.Done()
thumb, err := thumbnail.ImageFile(f)
if err != nil {
log.Println(err)
return
}
info, _ := os.Stat(thumb) // OK to ignore error
sizes <- info.Size()
}(f)
}
// closer
go func() {
wg.Wait()
close(sizes)
}()
var total int64
for size := range sizes {
total += size
}
return total
}
代码来自 The Go Programming Language ,觉得写得很巧妙。
- 通道是
goroutine之间进行通信的重要方式,可以用于传递数据和同步执行。在使用通道时,应该确保正确关闭通道,避免发生死锁。