go中 for循环的坑

在使用for循环修改结构体切片中的值时,发现并没有修改成功。

type Dog struct {
name string
} func (d *Dog) setNewName(name string) {
d.name = name
} func main() {
d := Dog{
name: "123",
}
d1 := Dog{
name: "456",
}
d2 := Dog{
name: "789",
}
dogSlice := make([]Dog, 0)
dogSlice = append(dogSlice, d, d1, d2)
for _, dog := range dogSlice {
dog.setNewName("123")
}
for _, dog := range dogSlice {
fmt.Println(dog)
}
}

结果切片中dog的name并没有全部变为123,后来查资料才知道for循环中的dog其实是个变量,指向的并不是真正的dog。

打印其地址对比可以看出压根就不同。

for i, dog := range dogSlice {
fmt.Printf("dog地址:%p 切片中dog的真正地址:%p\n", &dog, &(dogSlice[i]))
} dog地址:0x14000010230 切片中dog的真正地址:0x14000066180
dog地址:0x14000010230 切片中dog的真正地址:0x14000066190
dog地址:0x14000010230 切片中dog的真正地址:0x140000661a0

若要修改切片中的dog的name,应该按照以下这么写,或者将dogSlice变为存dog指针的切片,dogSlice := make([]*Dog, 0)

for i, _ := range dogSlice {
dogSlice[i].setNewName("123")
}
for _, v := range dogSlice {
fmt.Println(v)
} 打印如下:
{123}
{123}
{123}

go中 for循环的坑的更多相关文章

  1. java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例

    这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...

  2. 项目中踩过的坑之-sessionStorage

    总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...

  3. SQL中的循环、for循环、游标

    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...

  4. android中无限循环滑动的gallery实例

    android中无限循环滑动的gallery实例 1.点击图片有变暗的效果,使用imageview.setAlpha(),并且添加ontouchListener public void init() ...

  5. shell中的循环

    shell中的循环 for循环 类似于C语言的步长控制 例如: ;i<=;i++)); ); done 将1到10,依次乘以4,然后打印出来. 这里顺便提一下,shell里面表达式的计算,可以有 ...

  6. Oracle PL/SQL中的循环处理(sql for循环)

    今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在这里说下个人的理解. PL/SQL也和我们常用的编程语言 ...

  7. shell中for循环

    shell中for循环总结 最常用的就是遍历操作某一类文件,比如批量建索引. for i in `ls` do samtools faidx $i done 注意:for末尾不需要冒号(:),循环的代 ...

  8. shell中for循环总结

    关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总结,感觉很全面,所以就转过来研究研究,嘿嘿... 1. for((i=1;i<=10;i++));d ...

  9. Swift中的循环语句

    循环语句能够使程序代码重复执行.Swift编程语言支持4种循环构造类型:while.do while.for和for in.for和while循环是在执行循环体之前测试循环条件,而do while是在 ...

  10. java中for循环的6种写法

    有些写法上的说明写的过于武断,可能有很多不当之处,仅供参考.   package ForLoop; import java.util.ArrayList; import java.util.Itera ...

随机推荐

  1. java的两种线程

    java中的两种线程     守护线程与用户线程 守护线程:就是服务于用户线程的线程,例如垃圾回收的线程及时最典型的守护线程.不需要上层逻辑的介入 用户线程:就是程序自己创建的线程 守护线程; 守护线 ...

  2. Connect to D365 CE with multi-factor Authentication using C# sharp

    Effective Feb 4, 2020 - Use of the WS-Trust (Web-Service Trust) authentication security protocol whi ...

  3. Python操作数据库读书笔记

    SQLite 简介 什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.它是一个零配置的数据库,这意味着与其他数据库一样,您不需 ...

  4. 二、pycharm的安装

    1.python安装教程在上一篇已描述,详情查看: 2.安装pycharm 首先从网站下载pycharm:链接为:http://www.jetbrains.com/pycharm/download/# ...

  5. asp.net core项目部署IIS

    1.下载对应版本的webhost 我的是2.2 下载地址:https://download.visualstudio.microsoft.com/download/pr/ba001109-03c6-4 ...

  6. 日常笔记 - visual studio code快捷键

    环境: Mac + visual studio code 需求: 用vs code 编辑一个txt文档, 一行放不下, 在单行和多行显示之间切换. 快捷键: alt+z [参考链接] https:// ...

  7. mysql统计特定字符串出现次数

    其中'test'为原始字符串,'t'为特定字符串   SELECT floor((char_length('test') - char_length(replace('test', 't', '')) ...

  8. Android笔记--选择按钮

    复选框CheckBox 具体实现: 注意: 开关按钮switch 具体实现: 单选按钮RadioButton 需要放到radioGroup里面写单选按钮 具体实现:

  9. MySQL学习(一)大纲

    1.逻辑架构 参考博客:https://blog.csdn.net/fuzhongmin05/article/details/70904190 最上层为客户端层,并非mysql独有,诸如:连接处理.授 ...

  10. 常用ADB命令使用方法

    移动端操作流程 在设置中找到关于手机(或关于平板电脑) 连续点击版本号5次 在系统和更新中点击开发者选项 打开USB调试功能 PC端操作流程 打开cmd或powershell 移动到adb.exe所在 ...