golang copy函数使用的坑

 更新时间:2023年04月03日 15:11:57   作者:Robin92  
本文主要介绍了golang copy函数使用的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

之前用 copy 不多,本以为它是个很方便的函数,没想到在做练习题时竟还是被它坑了。是我对他期望太多了。

func copy(dst, src []Type) int

基本认识:

  • 它只能用于切片,不能用于 map 等任何其他类型
  • 它返回结果为一个 int 型值,表示 copy 的长度

坑位一:切片 dst 需要先初始化长度

不是你定义好类型,就能将 src 完全 copy 到 dst 的,你需要初始化长度。

  • 如果 dst 长度小于 src 的长度,则 copy 部分;
  • 如果大于,则全部拷贝过来,只是没占满 dst 的坑位而已;
  • 相等时刚好不多不少 copy 过来。

坑位二:源切片中元素类型为引用类型时,拷贝的是引用

由于只 copy 切片中的元素,所以如果切片元素的类型是引用类型,那么 copy 的也将是个引用。

如下面例子,matA 和 matB 地址不一样,但 matA[0] 和 matB[0] 的地址是一样的。

func wrongCopyMatrix() {
    matA := [][]int{
        {0, 1, 1, 0},
        {0, 1, 1, 1},
        {1, 1, 1, 0},
    }
    matB := make([][]int, len(matA))
    copy(matB, matA)
    fmt.Printf("%p, %p\n", matA, matA[0]) // 0xc0000c0000, 0xc0000c2000
    fmt.Printf("%p, %p\n", matB, matB[0]) // 0xc0000c0050, 0xc0000c2000
}

如果想 copy 多维切片中的每一个切片类型的元素,那么你需要将每个切片元素进行 初始化 并 拷贝。注意是两步:先 初始化,再 拷贝。

正确的拷贝一个多维数组:

func rightCopyMatrix() {
    matA := [][]int{
        {0, 1, 1, 0},
        {0, 1, 1, 1},
        {1, 1, 1, 0},
    }
    matB := make([][]int, len(matA))
    for i := range matA {
        matB[i] = make([]int, len(matA[i])) // 注意初始化长度
        copy(matB[i], matA[i])
    }
    fmt.Printf("%p, %p\n", matA, matA[0]) // 0xc00005c050, 0xc000018560
    fmt.Printf("%p, %p\n", matB, matB[0]) // 0xc00005c0a0, 0xc0000185c0
}

到此这篇关于golang copy函数使用的坑的文章就介绍到这了,更多相关golang copy函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mac OS系统安装golang教程

    Mac OS系统安装golang教程

    这篇文章主要介绍了Mac OS系统安装golang教程,本文还同时介绍了Sublime Text开发工具的配置,需要的朋友可以参考下
    2015-01-01
  • 教你用go语言实现比特币交易功能(Transaction)

    教你用go语言实现比特币交易功能(Transaction)

    每一笔比特币交易都会创造输出,输出都会被区块链记录下来。给某个人发送比特币,实际上意味着创造新的 UTXO 并注册到那个人的地址,可以为他所用,今天通过本文给大家分享go语言实现比特币交易功能,一起看看吧
    2021-05-05
  • Golang环境搭建及打包和工具链详解

    Golang环境搭建及打包和工具链详解

    这篇文章主要介绍了Golang环境搭建及打包和工具链,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Go设计模式之访问者模式讲解和代码示例

    Go设计模式之访问者模式讲解和代码示例

    访问者是一种行为设计模式, 允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为,本文将通过代码示例给大家详细的介绍一下Go设计模式之访问者模式,需要的朋友可以参考下
    2023-08-08
  • Go设计模式之状态模式讲解和代码示例

    Go设计模式之状态模式讲解和代码示例

    状态是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为,该模式将与状态相关的行为抽取到独立的状态类中, 让原对象将工作委派给这些类的实例, 而不是自行进行处理,本文将通过代码示例给大家简单的介绍一下Go状态模式
    2023-08-08
  • golang实现大文件读取的代码示例

    golang实现大文件读取的代码示例

    在实际工作,我们需要读取大数据文件,文件可能上G百G,所以我们不可能一次性的读取到内存,接下来本文给大家介绍了golang实现大文件读取的示例,需要的朋友可以参考下
    2024-04-04
  • 浅析Golang中的协程(goroutine)

    浅析Golang中的协程(goroutine)

    在Go语言中,协程(goroutine)是轻量级的线程,它是Go语言中实现并发编程的基础,Go语言中的协程是由Go运行时调度器(scheduler)进行管理和调度的,本文将给大家简单的介绍一下Golang中的协程,需要的朋友可以参考下
    2023-05-05
  • Golang实现优雅的将struct转换为map

    Golang实现优雅的将struct转换为map

    在项目实践中,有时候我们需要将struct结构体转为map映射表,然后基于map做数据裁剪或操作。那么下面我来介绍下常用的两种转换方式,希望对大家有所帮助
    2023-01-01
  • Go实现快速生成固定长度的随机字符串

    Go实现快速生成固定长度的随机字符串

    这篇文章主要为大家详细介绍了怎样在Go中简单快速地生成固定长度的随机字符串,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以学习一下
    2022-10-10
  • Golang搭建HTTP服务器

    Golang搭建HTTP服务器

    Golang是一种非常流行的编程语言,它的开发速度快,代码运行效率高等特点非常适合做Web应用的开发。本文将介绍如何使用Golang搭建HTTP服务器,需要的朋友可以参考阅读
    2023-04-04

最新评论