【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
相关推荐
IT_陈寒4 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端
Leighteen4 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
0566464 小时前
Python康复训练——控制流与函数
开发语言·python·学习
峥无4 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波4 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
Revolution614 小时前
React 组件重新渲染时,到底重新执行了什么
前端·react.js·面试
名字还没想好☜4 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
SomeB1oody4 小时前
【RustyML入门】1.0. 快速上手
开发语言·后端·机器学习·rust·教程
狗凯之家源码网5 小时前
短剧系统搭建实战:源码功能与商业变现效果全景展示
开发语言·php