← 返回目录

Go string 和 []byte 的区别

第 2 / 29 卷日期:

Go string 和 []byte 的区别

如果需要频繁地修改字符串内容,或者处理二进制数据,使用 []byte 更为合适。如果字符串内容基本保持不变,并且主要处理文本数据,那么使用 string 更为方便。

  1. 不可变性

string 是不可变的数据类型,一旦创建就不能被修改。任何修改 string 的操作都会产生一个新的 string,而原始的 string 保持不变。相比之下,[]byte 是可变的切片,可以通过索引直接修改切片中的元素。

  1. 类型转换

可以在 string 和 []byte 之间进行类型转换。使用 []byte(s) 可以将 string 转换为 []byte,而使用 string(b) 可以将 []byte 转换为 string。这个操作会创建新的底层数组,因此在转换后修改其中一个不会影

响另一个。

  1. 内存分配

string 是一个不可变的视图,底层数据是只读的。string 的内存分配和释放由Go运行时管理。

[]byte 是一个可变的切片,底层数据是可以修改的。[]byte 的内存管理由程序员负责。

  1. Unicode字符

string 中的每个元素是一个 Unicode 字符,而 []byte 中的每个元素是一个字节。因此,string 可以包含任意字符,而 []byte 主要用于处理字节数据。

make和new的区别

make和new是两个用于分配内存的内建函数, 在使用场景和返回值类型上有明显的区别。

make 用于创建并初始化切片、映射和通道等引用类型。它返回的是被初始化的非零值(非nil)的引用类型。

// 创建并初始化切片 slice := make([]int, 5, 10)

// 创建并初始化映射 myMap := make(map[string]int)

// 创建并初始化通道 ch := make(chan int)

new 用于分配值类型的内存,并返回该值类型的指针。它返回的是分配的零值的指针。

// 分配整数类型的内存,并返回指针 ptr := new(int)

全站分卷索引 · 29 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
  2. 2Go string 和 []byte 的区别
  3. 3数组和切片的区别
  4. 4扩容前后的Slice是一样的吗
  5. 5Go语言map是有序的还是无序的, 为什么
  6. 6go里面的map是并发安全的吗?如何并发安全
  7. 7Go 的错误处理和 Java 的异常处理对比
  8. 8介绍一下panic和recover
  9. 9什么是defer?有什么作用
  10. 10Go并发
  11. 11进程、线程的区别
  12. 12什么是go runtine
  13. 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
  14. 14什么是互斥锁(mutex)?在什么情况下会用到它们?
  15. 15Mutex有几种模式
  16. 16goroutine什么情况会发生内存泄漏?如何避免。
  17. 17Go语言中GC的流程是什么
  18. 18Go 中的内存逃逸现象是什么?
  19. 19CAP 理论,为什么不能同时满足
  20. 20说一下 Gin 的路由怎么实现的
  21. 21简述slice的底层原理,和数组的区别是什么
  22. 22defer底层原理
  23. 23侵入式和非侵入式的区别
  24. 24goroutine与线程的区别
  25. 25goroutine在什么情况下会被挂起呢?
  26. 26GC(垃圾回收)原理 1.5版本
  27. 27简述Go的垃圾回收机制
  28. 28协程优势及其通信方式
  29. 29Go的内存对齐