go中 for循环的坑
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循环的坑的更多相关文章
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
- 项目中踩过的坑之-sessionStorage
总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...
- SQL中的循环、for循环、游标
我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...
- android中无限循环滑动的gallery实例
android中无限循环滑动的gallery实例 1.点击图片有变暗的效果,使用imageview.setAlpha(),并且添加ontouchListener public void init() ...
- shell中的循环
shell中的循环 for循环 类似于C语言的步长控制 例如: ;i<=;i++)); ); done 将1到10,依次乘以4,然后打印出来. 这里顺便提一下,shell里面表达式的计算,可以有 ...
- Oracle PL/SQL中的循环处理(sql for循环)
今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在这里说下个人的理解. PL/SQL也和我们常用的编程语言 ...
- shell中for循环
shell中for循环总结 最常用的就是遍历操作某一类文件,比如批量建索引. for i in `ls` do samtools faidx $i done 注意:for末尾不需要冒号(:),循环的代 ...
- shell中for循环总结
关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总结,感觉很全面,所以就转过来研究研究,嘿嘿... 1. for((i=1;i<=10;i++));d ...
- Swift中的循环语句
循环语句能够使程序代码重复执行.Swift编程语言支持4种循环构造类型:while.do while.for和for in.for和while循环是在执行循环体之前测试循环条件,而do while是在 ...
- java中for循环的6种写法
有些写法上的说明写的过于武断,可能有很多不当之处,仅供参考. package ForLoop; import java.util.ArrayList; import java.util.Itera ...
随机推荐
- java的两种线程
java中的两种线程 守护线程与用户线程 守护线程:就是服务于用户线程的线程,例如垃圾回收的线程及时最典型的守护线程.不需要上层逻辑的介入 用户线程:就是程序自己创建的线程 守护线程; 守护线 ...
- 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 ...
- Python操作数据库读书笔记
SQLite 简介 什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.它是一个零配置的数据库,这意味着与其他数据库一样,您不需 ...
- 二、pycharm的安装
1.python安装教程在上一篇已描述,详情查看: 2.安装pycharm 首先从网站下载pycharm:链接为:http://www.jetbrains.com/pycharm/download/# ...
- asp.net core项目部署IIS
1.下载对应版本的webhost 我的是2.2 下载地址:https://download.visualstudio.microsoft.com/download/pr/ba001109-03c6-4 ...
- 日常笔记 - visual studio code快捷键
环境: Mac + visual studio code 需求: 用vs code 编辑一个txt文档, 一行放不下, 在单行和多行显示之间切换. 快捷键: alt+z [参考链接] https:// ...
- mysql统计特定字符串出现次数
其中'test'为原始字符串,'t'为特定字符串 SELECT floor((char_length('test') - char_length(replace('test', 't', '')) ...
- Android笔记--选择按钮
复选框CheckBox 具体实现: 注意: 开关按钮switch 具体实现: 单选按钮RadioButton 需要放到radioGroup里面写单选按钮 具体实现:
- MySQL学习(一)大纲
1.逻辑架构 参考博客:https://blog.csdn.net/fuzhongmin05/article/details/70904190 最上层为客户端层,并非mysql独有,诸如:连接处理.授 ...
- 常用ADB命令使用方法
移动端操作流程 在设置中找到关于手机(或关于平板电脑) 连续点击版本号5次 在系统和更新中点击开发者选项 打开USB调试功能 PC端操作流程 打开cmd或powershell 移动到adb.exe所在 ...