zoukankan      html  css  js  c++  java
  • golang 切片和数组在for...range中的区别

    切片是引用类型,而数组是值类型,并且for...range有以下规则:

    1. range表达式只会在for语句开始执行时被求值一次,无论后边会有多少次迭代
    2. range表达式的求值结果会被复制,也就是说,被迭代的对象是range表达式结果值的副本而不是原值
    package main
    
    import (
    	"fmt"
    )
    
    func main() {
      numbers2 := [...]int{1, 2, 3, 4, 5, 6}
      maxIndex2 := len(numbers2) - 1
      for i, e := range numbers2 {
        if i == maxIndex2 {
          numbers2[0] += e
        } else {
          numbers2[i+1] += e
        }
      }
      fmt.Println(numbers2)
      numbers3 := []int{1, 2, 3, 4, 5, 6}
      maxIndex2 = len(numbers3) - 1
      for i, e := range numbers3 {
        if i == maxIndex2 {
          numbers3[0] += e
        } else {
          numbers3[i+1] += e
        }
      }
      fmt.Println(numbers3)
    }
    
    打印结果
    [7 3 5 7 9 11]
    [22 3 6 10 15 21]
    

    在range开始迭代时就浅拷贝了一个副本,对数组来说,相当于拷贝了一个新的数组进行迭代,修改原数组不会影响被迭代数组。而对于切片来说,range拷贝出来的切片与原切片底层是同一个数组,因此对原切片的修改也会影响到被迭代切片

  • 相关阅读:
    将ObservableCollection(Of T) 数据 绑定到 Canvas
    StylusNodeJS下构建更富表现力/动态/健壮的CSS
    string引用类型
    c#之预处理器指令
    c#继承与构造函数
    c#构造函数
    c#之扩展方法
    c#之结构
    继承与重写
    dedict: 很有新意的图形化英汉字典
  • 原文地址:https://www.cnblogs.com/linyihai/p/10242272.html
Copyright © 2011-2022 走看看