当前位置: 首页 > news >正文

go语言多重复值

例题思考

func main() {arr := make([]int, 5)fmt.Println(arr)i := 1i, arr[i] = 2, 3fmt.Println(i)fmt.Println(arr)
}// [0 0 0 0 0]
// 2
// [0 3 0 0 0]

正确的执行顺序

实际上,Go语言的多重赋值机制比最初描述的要更精细。正确的执行顺序是:

  1. 先计算所有右侧表达式的值(从左到右)
  2. 然后从左到右赋值给左侧变量

对于i, arr[i] = 2, 3的具体执行步骤:

  1. 计算右侧表达式:
    • 第一个值:2
    • 第二个值:3

此时会先确定 arr[i] 中的 i 的当前值(因为这是表达式求值阶段)

  1. 赋值阶段:
    • 第一个赋值:i = 2(此时i被更新为2)
    • 第二个赋值:arr[i] = 3(这里的i使用的是原始值,不是刚赋值的2)

关键点说明

表达式求值阶段:在计算右侧所有表达式时,会固定所有需要使用的索引和地址
赋值阶段:按照从左到右的顺序进行赋值,但使用的索引是在表达式求值阶段确定的

Go语言规范明确指出:

  • 在赋值语句中,右侧的表达式会先全部被求值
  • 然后按从左到右的顺序进行赋值
  • 当表达式中有索引时(如 arr[i]),索引值是在表达式求值阶段确定的

更复杂的例子

func main() {i := 1arr := []int{0, 0, 0}i, arr[i], arr[i-1] = i+1, i+2, i+3fmt.Println(arr)
}
// [4 3 0]

执行过程:

  1. 求值右侧:

    • i+1 = 2
    • i+2 = 3
    • i+3 = 4
    • 确定索引:arr[i]→arr[1], arr[i-1]→arr[0]
  2. 赋值:

    • i = 2
    • arr[1] = 3
    • arr[0] = 4

结果i=2, arr=[4,3,0]

总结

表达式求值阶段就已经确定了arr[i]中的i值,不会受到后续i赋值的影响。

http://www.lqws.cn/news/501157.html

相关文章:

  • Linux 设备驱动之网络设备驱动
  • 新中国风通用读书颂词分享PPT模版
  • 对手机屏中断路和短路的单元进行切割或熔接,实现液晶线路激光修复原理
  • libevent(1)之基础概述
  • bmc TrueSight 监控 Oracle 11g 配置
  • Flutter 与 原生(Android/iOS)通信 Platform Channel
  • ASP.NET Core 中 Kestrel 的应用及在前后端分离项目中的角色
  • SnowConvert:自动化数据迁移的技术解析与最佳实践
  • 深入JVM:从零到实战,解锁Java性能与调优的终极武器
  • JDK 17 中 java.lang.System 常用方法及应用场景
  • 对于高考边界的理解以及未来就业层级的学习与思考
  • 鸿蒙HarmonyOS 5开发:AlphabetIndexer组件在通讯录中的高效索引实现(附:代码)
  • Linux环境下MariaDB如何实现负载均衡
  • 华为云Flexus+DeepSeek征文 | 基于CCE容器的AI Agent高可用部署架构与弹性扩容实践
  • C++修炼:异常
  • Excel学习04
  • 代理模式:控制对象访问的守门员[特殊字符],优雅实现功能增强与访问控制!
  • 嵌入式Linux驱动开发基础-1 hello驱动
  • 【大模型问题】ms-swift微调时,显存持续增长原因分析与解决方案
  • 【CS创世SD NAND征文】基于全志V3S与CS创世SD NAND的物联网智能路灯网关数据存储方案
  • Nginx负载均衡
  • Docker 数据持久化完全指南:Volume、Bind Mount 与匿名卷
  • OpenCV CUDA模块设备层-----创建一个“常量指针访问器” 的工具函数constantPtr()
  • Docker Compose与私有仓库部署
  • Vue3+TypeScript移动端H5播放器选型指南:M3U8与主流播放器深度解析
  • 聚宽量化——股票时间序列函数
  • 传统消防演练与 VR 消防演练的区别有哪些
  • Unreal5从入门到精通之如何录制360°VR全景视频
  • Python-3-数据结构(列表)
  • Android edge-to-edge兼容适配