zoukankan      html  css  js  c++  java
  • golang slice分割和append copy还是引用

    转载自:http://studygolang.com/articles/724

    1.

    slice1:= slice[0:2]

    引用,非复制,所以任何对slice1或slice的修改都会影响对方

    data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
    data1 := data[0:2]
    data1[0] = 99
    fmt.Println(data1)
    fmt.Println(data)

    [99 2]

    [99 2 3 4 5 6 7 8 9 0]

    2.append

    append 比较特殊

    声明:

    源slice= src

    添加slice = app

    结果slice=tar

    1)如果len(src) + len(app) <= cap(src)  src和tar 是指向同一数据引用 ,即修改src或tar,会影响对方

    2)否则 tar 是copy的方式 src + app ,即修改src或tar,不会影响对方

    无论哪种情况不会影响app,因为app都会用copy的方式进入tar

    func test2() {
    	data := make([]int, 10, 20)
    	data[0] = 1
    	data[1] = 2
    	dataappend := make([]int, 10, 20)//len <=10 则 	result[0] = 99 会 影响源Slice
    	dataappend[0] = 1
    	dataappend[1] = 2
    	result := append(data, dataappend...)
    	result[0] = 99
    	result[11] = 98
    	fmt.Println("length:", len(data), ":", data)
    	fmt.Println("length:", len(result), ":", result)
    	fmt.Println("length:", len(dataappend), ":", dataappend)
    }

    3.
    另外我自己补充一点:
    其中CounterAdapter是一个结构体
        list := make([]CounterAdapter, 0)
        ca := CounterAdapter{}
        for i := 1; i <= 3; i++ {
            ca.Data.Cycle = int64(i)
            ca.Data.HostName = fmt.Sprintf("%d", i)
            list = append(list, ca)
        }
        fmt.Println(list)
    输出的list的3个结点分别是不一样的,得出结果,append单个结构体是copy的
  • 相关阅读:
    TJU_SCS_软件测试_lab2_Selenium
    TJU_SCS_软件测试_homework3
    阅读《基于谱聚类的终端区飞行轨迹分析》笔记
    阅读《基于转弯点聚类的航空飞行轨迹分析》笔记
    TJU_SCS_软件测试_Lab1
    TJU_SCS_软件测试_homework2
    TJU_SCS_软件测试_homework1——《error impressed me most》
    TJU_SCS_C#学习笔记(10)
    TJU_SCS_C#学习笔记(9)
    TJU_SCS_C#学习笔记(8)
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/6855388.html
Copyright © 2011-2022 走看看