【Golang 面试题】每日 3 题(十三)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/UWz06

📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

37. Go slice 深拷贝

深拷贝:拷贝的是数据本身,创造一个新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值。

实现深拷贝的方式:

  1. copy(slice2, slice1)
  2. 遍历 append 赋值
go 复制代码
func main() {
    slice1 := []int{1, 2, 3, 4, 5}
    fmt.Printf("slice1: %v, %p", slice1, slice1)
    
    slice2 := make([]int, 5, 5)
    copy(slice2, slice1)
    fmt.Printf("slice2: %v, %p", slice2, slice2)
    
    slice3 := make([]int, 0, 5)
    for _, v := range slice1 {
        slice3 = append(slice3, v)
    }
    fmt.Printf("slice3: %v, %p", slice3, slice3)
}
复制代码
slice1: [1 2 3 4 5], 0xc0000b0030
slice2: [1 2 3 4 5], 0xc0000b0060
slice3: [1 2 3 4 5], 0xc0000b0090

38. Go slice 浅拷贝

浅拷贝:拷贝的是数据地址,只复制指向的对象的指针,此时新对象和老对象指向的内存地址是一样的,新对象值修改时老对象也会变化。

实现浅拷贝的方式:

引用类型的变量,默认赋值操作就是浅拷贝。

  1. slice2 := slice1
go 复制代码
func main() {
    slice1 := []int{1, 2, 3, 4, 5}
    fmt.Printf("slice1: %v, %p", slice1, slice1)
    slice2 := slice1
    fmt.Printf("slice2: %v, %p", slice2, slice2)
}
复制代码
slice1: [1 2 3 4 5], 0xc00001a120
slice2: [1 2 3 4 5], 0xc00001a120

39. Go slice 扩容机制?

扩容会发生在 slice append 的时候,当 slice 的 cap 不足以容纳新元素,就会进行扩容,扩容规则如下:

  • 如果新申请容量比两倍原有容量大,那么扩容后容量大小为新申请容量。
  • 如果原有 slice 长度小于 1024, 那么每次就扩容为原来的 2 倍。
  • 如果原 slice 长度大于等于 1024, 那么每次扩容就扩为原来的 1.25 倍。
go 复制代码
func main() {
    slice1 := []int{1, 2, 3}
    for i := 0; i < 16; i++ {
        slice1 = append(slice1, 1)
        fmt.Printf("addr: %p, len: %v, cap: %v
", slice1, len(slice1), cap(slice1))
    }
}
复制代码
addr: 0xc00001a120, len: 4, cap: 6
addr: 0xc00001a120, len: 5, cap: 6
addr: 0xc00001a120, len: 6, cap: 6
addr: 0xc000060060, len: 7, cap: 12
addr: 0xc000060060, len: 8, cap: 12
addr: 0xc000060060, len: 9, cap: 12
addr: 0xc000060060, len: 10, cap: 12
addr: 0xc000060060, len: 11, cap: 12
addr: 0xc000060060, len: 12, cap: 12
addr: 0xc00007c000, len: 13, cap: 24
addr: 0xc00007c000, len: 14, cap: 24
addr: 0xc00007c000, len: 15, cap: 24
addr: 0xc00007c000, len: 16, cap: 24
addr: 0xc00007c000, len: 17, cap: 24
addr: 0xc00007c000, len: 18, cap: 24
addr: 0xc00007c000, len: 19, cap: 24
相关推荐
舒一笑19 小时前
Saga分布式事务框架执行逻辑
后端·程序员·设计
Emma歌小白19 小时前
完整后台模块模板
后端
得物技术19 小时前
MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈|得物技术
数据库·后端·mysql
Emma歌小白19 小时前
配套后端(Node.js + Express + SQLite)
后端
isysc119 小时前
面了一个校招生,竟然说我是老古董
java·后端·面试
uhakadotcom20 小时前
静态代码检测技术入门:Python 的 Tree-sitter 技术详解与示例教程
后端·面试·github
幂简集成explinks20 小时前
e签宝签署API更新实战:新增 signType 与 FDA 合规参数配置
后端·设计模式·开源
River41620 小时前
Javer 学 c++(十三):引用篇
c++·后端
一直_在路上20 小时前
Go 语言微服务演进路径:从小型项目到企业级架构
架构·go