go实现for range迭代时修改值的操作

for range的val不能直接修改

因为地址不同

package main
import "fmt"
func main() {
	x := make([]int, 3)
	x[0], x[1], x[2] = 1, 2, 3
	for i, val := range x {
		fmt.Println(&x[i], "vs.", &val)
	}
}
//输出
0x416020 vs. 0x41602c
0x416024 vs. 0x41602c
0x416028 vs. 0x41602c

补充:GO语言使用range遍历数组,值不被改变(避开range坑)

首先GO语言遍历数组两种方式

一种是

for i:=0;i<len;i++{}

这种方式,就是如果在循环中更改数组的值,则会更改到原数组的值。没有进行数组值的复制

第二种方式

也是主要介绍的就是range遍历数组

for _,num :=range arr{}

这种方式遍历数组,会将遍历的数组的每一个元素进行复制,通过使用复制的值,进行for循环的内容,在for循环中进行更改值,不会影响原数组的值

举例说明:

func (student Student) rename() {
	student.name = "xiang"
}
func main() {
	var a []int
	a = []int{1, 2, 3, 4, 5, 6, 7, 8}
	for i := 0; i < len(a); i++ {
		a[i] = 0
	}
	fmt.Println(a)
}

此时用的是for i:=0;i<len;i++循环方式,,根据输出,可以判断,修改的是原数组。

使用Range遍历数组

func main() {
	var a []int
	a = []int{1, 2, 3, 4, 5, 6, 7, 8}
	for _, num := range a {
		num = 0
		fmt.Print(num, " ")
	}
	fmt.Println(a)
}

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

(0)

相关推荐

  • golang中for range的取地址操作陷阱介绍

    Tips:for range创建了每个元素的副本,而不是直接返回每个元素的引用 例子1: package main import "fmt" func main() { slice := []int{0, 1, 2, 3} myMap := make(map[int]*int) for index, value := range slice { myMap[index] = &value } fmt.Println("=====new map=====")

  • go for range遍历二维数组的示例

    go for range 遍历二维数组 var arry [2][3] int for index,_ := range arry { fmt.Print(index) } 运行结果: 0 1   没有遍历所有的6个元素. 二维数组 arry 可以理解为:拥有两个 一维数组元素 的一维数组,所以以上只是遍历了其的两个元素,index分别是0 1,value是两个 拥有三个int类型元素 的一维数组. var arry [2][3] int for index,value := range arr

  • Go语言for range(按照键值循环)遍历操作

    Go 语言可以使用 for range 遍历数组.切片.字符串.map 及通道(channel).通过 for range 遍历的返回值有一定的规律: 数组.切片.字符串返回索引和值. map 返回键和值. 通道(channel)只返回通道内的值. 遍历数组.切片--获得索引和元素 在遍历代码中,key 和 value 分别代表切片的下标及下标对应的值.下面的代码展示如何遍历切片,数组也是类似的遍历方法: for key, value := range []int{1, 2, 3, 4} { f

  • 详解Go语言中for range的"坑"

    前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下: func main() { arr1 := []int{1, 2, 3} arr2 := make([]*int, len(arr1)) for i, v := range arr1 { arr2[i] = &v } for _, v := range arr2 { fmt.Println(*v) } } 代码解析

  • go for range坑和闭包坑的分析

    看程序: package main import ( "fmt" "time" ) func main() { str := []string{"I","like","Golang"} for _, v := range str{ v += "good" } for k, v := range str{ fmt.Println(k, v) } time.Sleep(1e9) } 结果:

  • go实现for range迭代时修改值的操作

    for range的val不能直接修改 因为地址不同 package main import "fmt" func main() { x := make([]int, 3) x[0], x[1], x[2] = 1, 2, 3 for i, val := range x { fmt.Println(&x[i], "vs.", &val) } } //输出 0x416020 vs. 0x41602c 0x416024 vs. 0x41602c 0x41

  • Python实现迭代时使用索引的方法示例

    本文实例讲述了Python实现迭代时使用索引的方法.分享给大家供大家参考,具体如下: 索引迭代 Python中,迭代永远是取出元素本身,而非元素的索引. 对于有序集合,元素确实是有索引的.有的时候,我们确实想在 for 循环中拿到索引,怎么办? 方法是使用 enumerate()函数: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] >>> for index, name in enumerate(L): ... print index

  • Pandas DataFrame数据修改值的方法

    dfmi.iloc[:,1] pandas要修改值先需要了解DataFrame的一些知识 此处参照的是pandas的官方文档 When setting values in a pandas object, care must be taken to avoid what is calledchained indexing. Here is an example. 要修改pandas--DataFrame中的值要注意避免在链式索引上得到的DataFrame的值 这里创建了一个DataFrame d

  • Vue watch中监听值的变化,判断后修改值方式

    目录 watch监听值的变化,判断后修改值 watch监听data函数中数据改变的三种方式 1.常用型(浅层监听) 2.深层监听(利用deep属性) 3.深层监听某一个特定属性(用字符串表示对象属性的调用) watch监听值的变化,判断后修改值 计数器有最小值与最大值的限制,且中间的文本输入框可自己输入值. 实现方式是在watch中监听文本输入框绑定的v-model,跟最大最小值比较后,如果有需要,则改变值. <mu-text-field v-model.number="weightNum

  • layui table单元格事件修改值的方法

    事件中的 this相当于document.getElementById("id") 替代方法就是将原本 document.getElementById("id").InnerHTML = "填充代码"; 替换成 $("#id").html("填充代码"); <!DOCTYPE html> <html> <head> <meta charset="utf-8

  • vue遍历生成的输入框 绑定及修改值示例

    对于vue遍历生成的输入框进行其值的修改与保存是vue项目开发过程中的一种常规操作.这种操作的难点在于生成数量的不确定,不能在在组件中的data直接定义. 思路 获取生成的输入框数量 初始化数组,数组的长度与待绑定输入框数量一致 将每一个输入框的v-model与数组特定项进行绑定 实现代码 1.data中定义一个存放model值的空数组 data() { return { inputData :[] } } 2.将获取到的数组遍历,将获取到的值插入空数组 res.data.rows.map(v.

  • java 通过反射遍历所有字段修改值的实例代码

    先给大家介绍下java遍历所有字段修改值的代码,具体内容详情如下所示: java 通过反射遍历所有字段修改值,避免重复set.get 比如一张表里的字段十几个,而这个表里的图片存储字段有八九个,在返回这个实体类的时候,要对图片进行加密或者其他操作,那就要在实体类查询结果出来后,一个个的get修复,再set赋值,代码量很多,另外如果有多个接口用到,就会产生重复代码: 通过java 的反射,遍历所有字段,进行一个判断,取出来的值是带有图片链接的,进行操作,省去了很多代码,下面贴代码 import o

  • pandas Dataframe实现批量修改值的方法

    目录 1.使用iloc对数据进行批量修改 2.对数据进行判定后,相互+/-/某个数* 第一种方法:使用内置函数where函数 第二种方法:使用mask函数 第三种方法:replace函数 1.使用iloc对数据进行批量修改 使用iloc最简单的就是将数据批量修改为某个特定的值 以下是我随便写入的数据: 现在将[‘d’,‘e’]列,[2,3,4]行的数据全部修改为0 import pandas as pd data = pd.read_excel('some_chaneg.xlsx') data1

  • Pytorch反向传播中的细节-计算梯度时的默认累加操作

    Pytorch反向传播计算梯度默认累加 今天学习pytorch实现简单的线性回归,发现了pytorch的反向传播时计算梯度采用的累加机制, 于是百度来一下,好多博客都说了累加机制,但是好多都没有说明这个累加机制到底会有啥影响, 所以我趁着自己练习的一个例子正好直观的看一下以及如何解决: pytorch实现线性回归 先附上试验代码来感受一下: torch.manual_seed(6) lr = 0.01 # 学习率 result = [] # 创建训练数据 x = torch.rand(20, 1

随机推荐