Go语言学习日志

90 阅读2分钟

Go的字符串

Go 语言的字符串处理是开发中非常常见的任务,正确地使用字符串可以提高代码的可读性和性能。下面是学习过程中我觉得的注意事项

  1. 使用反引号创建原始字符串 如果字符串中包含多行文本特殊字符,可以使用反引号` `来创建原始字符串,它可以保持原始文本格式,不需要转义特殊字符。
  2. Go 语言中,可以使用 + 号来连接字符串。但在大量字符串连接时,使用 strings.Builder 类型,可以提高字符串连接的性能。当需要将多个字符串连接成一个字符串时,也可以使用 strings.Join 函数,它比使用 + 运算符效率更高。
  3. 在 Go 中,字符串是不可变的,不能像数组一样直接修改字符串的某个字符。 可以先将其转换为 []byte 类型,然后再进行修改。但是转换后的新切片会拷贝原始字符串的内容。

Go的切片(Slice)

Go 语言的slice 是一个非常强大且灵活的数据结构,类似于java的ArryList,允许我们动态地管理和操作数组。

  1. 当多个切片共享同一个底层数组时,其中一个切片的修改可能会影响其他切片的值。为了避免这种情况,可以使用 copy 函数创建一个新的切片,这样它就不再共享底层数组。
  2. 在使用 for 循环遍历切片时,不要在迭代过程中修改切片的长度,因为这可能会导致意外的结果或死循环。如果需要修改切片,可以在循环外部进行操作,或者使用新的切片来保存修改后的数据。
  3. 在知道大小的情况下,指定slice的长度,可以避免多次内存分配

Goroutine

Go 语言的 goroutine 是一种轻量级的并发机制,它可以在单个程序中同时执行多个任务,大大提高程序的并发性能。

  1. 在使用 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 ,觉得写得很巧妙。

  1. 通道是 goroutine 之间进行通信的重要方式,可以用于传递数据和同步执行。在使用通道时,应该确保正确关闭通道,避免发生死锁。