0
点赞
收藏
分享

微信扫一扫

golang 有哪些数据拷贝的场景

鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)



在 Go 语言中,数据的拷贝可以发生在多种场景,以下是一些常见的场景:

  1. 函数参数的拷贝传递:在 Go 中,函数的参数是通过值传递的,这意味着当你将一个变量作为参数传递给函数时,实际上传递的是这个变量的拷贝。

func modify(n int) {    n += 10} func main() {    x := 10    modify(x)    fmt.Println(x) // 输出 10,因为 modify 函数中的 n 是 x 的拷贝}

  1. 多变量返回:在 Go 中,返回的多个值将被拷贝到调用者的变量中。

func returnsTwoValues() (int, int) {    return 10, 20} func main() {    a, b := returnsTwoValues()    fmt.Println(a, b) // 输出 10 20}

  1. 切片的拷贝:当你创建一个新的切片并使用原始切片初始化时,实际上是在创造一个新的切片,这个新的切片拥有和原始切片相同的容量和长度,并且包含相同的元素拷贝。

original := []int{1, 2, 3}copy := make([]int, len(original))copy = original // 这里实际上是拷贝了 original 的每个元素到 copy 的各个位置

  1. 深拷贝与浅拷贝:当你在处理复杂数据类型(如结构体、数组、切片、map等)时,你需要特别注意浅拷贝和深拷贝的概念。浅拷贝只复制了指向数据的指针或引用,而深拷贝则创建了数据的一个完整拷贝。

type Person struct {    Name string    Age  int} func shallowCopy(p Person) {    p.Age = 30} func deepCopy(p Person) {    newP := Person{        Name: p.Name,        Age:  p.Age,    }    newP.Age = 30} func main() {    p := Person{Name: "Alice", Age: 20}    shallowCopy(p)    fmt.Println(p.Age) // 输出 30,因为 shallowCopy 修改的是 p 的拷贝     deepCopy(p)    fmt.Println(p.Age) // 输出 20,因为 deepCopy 修改的是 p 的独立拷贝}

  1. 通过值接收方法的返回值:如果一个方法返回的是一个大的数据结构,并且你希望避免原地修改这个结构,你可以通过值的方式来接收这个返回值。

type BigData []int func (b BigData) modify() BigData {    b[0] = 100    return b} func main() {    original := BigData{1, 2, 3}    modified := original.modify() // 这里 modified 是 original 的一个拷贝    fmt.Println(original[0])      // 输出 1,original 未被修改}

以上是一些在 Go 语言中常见的数据拷贝场景,需要注意的是,虽然这些场景中涉及到了拷贝,但是在某些情况下 Go 编译器或运行时会做出优化,使得实际的拷贝次数减少,从而提高程序的性能。

举报

相关推荐

0 条评论