【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
相关推荐
徐子元竟然被占了!!2 分钟前
IS-IS协议
开发语言·网络·php
小猪皮蛋粥10 分钟前
python画图
开发语言·python
Felven11 分钟前
A. The 67th Integer Problem
开发语言
zopple13 分钟前
Laravel7.x核心特性全解析
开发语言·php·laravel
wjs202414 分钟前
MVC 应用程序
开发语言
studyForMokey14 分钟前
【Android面试】Java专题 todo
android·java·面试
lly20240615 分钟前
ionic 模态窗口:全面解析与最佳实践
开发语言
小白学大数据16 分钟前
解决 Python 爬虫被限制:延迟抓取指令深度解析
开发语言·c++·爬虫·python
一只大袋鼠19 分钟前
MyBatis 特性(三):缓存、延迟加载、注解开发
java·数据库·笔记·sql·缓存·mybatis
三品吉他手会点灯20 分钟前
C语言学习笔记 - 3. C概述 - C语言的起源和发展
c语言·笔记·学习