广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 拷贝Array或Slice的操作
  • 959
分享到

Golang 拷贝Array或Slice的操作

2024-04-02 19:04:59 959人浏览 八月长安
摘要

golang中Array是值类型而slice是引用类型。因此两者之间的赋值或拷贝有些差异,本文带你了解各自的差异。 1. 拷贝array 前面提及数组是值类型,所以数组变量名不是指向

golang中Array是值类型而slice是引用类型。因此两者之间的赋值或拷贝有些差异,本文带你了解各自的差异。

1. 拷贝array

前面提及数组是值类型,所以数组变量名不是指向第一个元素的指针。事实上它表示整个数组,下面两者情况将自动创建数组:

数组变量赋值给另一个数组变量

数组变量传递作为函数参数

请看示例:


package main
import "fmt"
func main() {
    sample1 := [2]string{"a", "b"}
    fmt.Printf("Sample1 Before: %v\n", sample1)
    sample2 := sample1
    sample2[0] = "c"
    fmt.Printf("Sample1 After assignment: %v\n", sample1)
    fmt.Printf("Sample2: %v\n", sample2)
    test(sample1)
    fmt.Printf("Sample1 After Test Function Call: %v\n", sample1)
}
func test(sample [2]string) {
    sample[0] = "d"
    fmt.Printf("Sample in Test function: %v\n", sample)
}

输出结果:

Sample1 Before: [a b]

Sample1 After assignment: [a b]

Sample2:

Sample in Test function: [d b]

Sample1 After Test Function Call: [a b]

我们稍作解释:

sample1 赋给 sample2 ,然后修改sample2中第一个元素。打印sample1验证是否有影响,当然没有改变。这是因为sample1 赋给 sample2,会创建sample1的拷贝给sample2,故修改sample2不影响sample1.

传递sample1给test函数,然后在函数体内修改其第一个元素。之后打印sample1验证是否有影响,当然也没有。原因是一样的,当sample1作为参数传递给test时,sample1的拷贝被创建并传入,因此修改不会影响原来sample1.

2. 拷贝slice

Golang内置包提供copy函数能够拷贝slice,函数前面如下,其返回拷贝元素个数:


func copy(dst, src []Type) int

使用copy函数需要考虑两种情况:

如果src长度大于dst,那么仅拷贝dst长度个元素

如果dst长度大于src,那么仅拷贝src长度个元素

总结为拷贝两者最小长度元素:min(src,dst)

需要注意的是,一旦拷贝完成,对目标的修改不会影响源,反之亦然。

我们也通过示例说明:


package main
import "fmt"
func main() {
    src := []int{1, 2, 3, 4, 5}
    dst := make([]int, 5)
    numberOfElementsCopied := copy(dst, src)
    fmt.Printf("Number Of Elements Copied: %d\n", numberOfElementsCopied)
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)
    //After changing numbers2
    dst[0] = 10
    fmt.Println("\nAfter changing dst")
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)
}

输出如下:

Number Of Elements Copied: 5

dst: [1 2 3 4 5]

src: [1 2 3 4 5]

After changing dst

dst: [10 2 3 4 5]

src: [1 2 3 4 5]

3. 总结

本文介绍了Go Array和Slice直接拷贝。Array是值类型直接赋值即拷贝,Slice是引用类型,直接赋值是指针会影响源Slice,但可以通过内置copy函数实现赋值功能。

补充:golang字节数组拷贝BlockCopy函数实现

C#中,Buffer.BlockCopy(Array, Int32, Array, Int32, Int32) 函数使用比较广泛,其含义:

将指定数目的字节从起始于特定偏移量的源数组复制到起始于特定偏移量的目标数组。

参数 src Array 源缓冲区。 srcOffset Int32 src 中的字节偏移量,从零开始。 dst Array 目标缓冲区。 dstOffset Int32 dst 中的字节偏移量,从零开始。 count Int32 要复制的字节数。

go语言中实现如下:


func blockCopy(src []byte, srcOffset int, dst []byte, dstOffset, count int) (bool, error) {
    srcLen := len(src)
    if srcOffset > srcLen || count > srcLen || srcOffset+count > srcLen {
        return false, errors.New("源缓冲区 索引超出范围")
    }
    dstLen := len(dst)
    if dstOffset > dstLen || count > dstLen || dstOffset+count > dstLen {
        return false, errors.New("目标缓冲区 索引超出范围")
    }
    index := 0
    for i := srcOffset; i < srcOffset+count; i++ {
        dst[dstOffset+index] = src[srcOffset+index]
        index++
    }
    return true, nil
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文档:

--结束END--

本文标题: Golang 拷贝Array或Slice的操作

本文链接: https://www.lsjlt.com/news/124868.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang 拷贝Array或Slice的操作
    Golang中Array是值类型而slice是引用类型。因此两者之间的赋值或拷贝有些差异,本文带你了解各自的差异。 1. 拷贝array 前面提及数组是值类型,所以数组变量名不是指向...
    99+
    2022-11-12
  • 怎么在Golang对Array和Slice进行拷贝
    怎么在Golang对Array和Slice进行拷贝?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译...
    99+
    2023-06-14
  • Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
    程序中常常需要复制一个对象, 按思路应该是这样的 a = [1, 2, 3] b = a # [1, 2, 3] print b 已经复制好了,但是现在得改变一下第一个元素的值把它改成5 ...
    99+
    2022-06-04
    模块 操作 方法
  • Python:通配符查找、拷贝文件的操作
    把文件夹dir1中后缀为'.jpg'的文件拷贝到文件夹dir2中: import glob import shutil import sys if __name__ == '_...
    99+
    2022-11-12
  • docker cp 拷贝文件 和 进入容器的操作
    进入正在运行的容器 # 进入容器 新开一个终端 # docker exec -it 容器id /bin/bash docker exec -it eaac94ef6926 /bi...
    99+
    2022-11-11
  • BeanUtils.copyProperties在拷贝属性时忽略空值的操作
    BeanUtils.copyProperties忽略空值 使用spring开发的人,对这行代码肯定不陌生,常用于DTO、VO、PO之间的复制。 BeanUtils.copyPr...
    99+
    2022-11-12
  • C++中怎么实现对象的拷贝与赋值操作
    今天就跟大家聊聊有关C++中怎么实现对象的拷贝与赋值操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。拷贝构造函数,顾名思义,等于拷贝 + 构造。它肩负着创建新对象的任务,同时还要负...
    99+
    2023-06-17
  • 在golang xorm中使用postgresql的json,array类型的操作
    xorm支持各种关系数据库,最近使用postgresql时,总是踩到一些坑,在此记录下解决方式。 在使用postgresql的array类型时,查询有点问题,xorm的官方文档给出重...
    99+
    2022-11-12
  • Node.js本地文件操作之文件拷贝与目录遍历的方法
    文件拷贝 NodeJS 提供了基本的文件操作 API,但是像文件拷贝这种高级功能就没有提供,因此我们先拿文件拷贝程序练手。与 copy 命令类似,我们的程序需要能接受源文件路径与目标文件路径两个参数。 小文...
    99+
    2022-06-04
    遍历 操作 本地文件
  • 使用golang如何优雅的关机或重启操作示例
    目录前言优雅地关机什么是优雅关机?如何实现优雅关机?优雅地重启总结前言 我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作