讲师中心 微信公众号
AI工具推荐 视频效率加速

Go语言中range循环的标识符与表达式赋值详解

大浩小哥_2410

大浩小哥_2410

发布时间:2025-11-08 15:50:17

|

387人浏览过

|

来源于php中文网

原创

Go语言中range循环的标识符与表达式赋值详解

go语言的`range`关键字在迭代过程中提供了两种灵活的赋值方式:通过标识符(`identifierlist :=`)声明并初始化新的局部变量,或通过表达式(`expressionlist =`)将迭代值赋给已存在的变量或由表达式计算出的可赋值位置。理解这两种机制对于高效和准确地使用`range`循环至关重要,它们分别适用于声明新变量和更新现有存储位置的不同场景。

Go语言range循环概述

range关键字是Go语言中用于迭代数组、切片、字符串、映射和通道的强大工具。它允许我们遍历集合中的元素,并在每次迭代时获取索引和/或值。根据Go语言规范,range子句的语法结构如下:

RangeClause = ( ExpressionList "=" | IdentifierList ":=" ) "range" Expression .

这表明在range关键字之前,我们可以使用两种不同的赋值方式:

  1. IdentifierList :=: 使用短变量声明操作符:=,将迭代结果赋给一个或多个标识符。
  2. ExpressionList =: 使用赋值操作符=,将迭代结果赋给一个或多个表达式。

这两种方式的核心区别在于它们如何处理赋值的左侧,以及它们在作用域和变量生命周期上的含义。

标识符赋值 (IdentifierList :=)

当我们需要在range循环的每次迭代中声明并使用新的局部变量来接收迭代值时,会采用标识符赋值的方式。

立即学习“go语言免费学习笔记(深入)”;

核心特点:

  • 短变量声明: 使用:=操作符。这意味着左侧的标识符在当前作用域中是首次声明。
  • 新建变量: 每次迭代都会创建(或更新)这些局部变量,它们的作用域仅限于循环体内部。
  • 遵守标识符规则: 左侧的标识符必须符合Go语言的命名规则(例如,以字母或下划线开头,包含Unicode字符,不含空格等)。

示例代码:

以下示例展示了如何使用标识符i来接收切片迭代中的索引值:

package main

import "fmt"

func main() {
    // 遍历一个整数切片,并将索引赋值给新的标识符 i
    for i := range []int{1, 2, 3} {
        fmt.Printf("当前索引: %d\n", i)
    }
    // 输出:
    // 当前索引: 0
    // 当前索引: 1
    // 当前索引: 2
}

在这个例子中,i是一个在for循环体内声明的新变量。每次循环迭代时,range会将其生成的索引值赋给i。

Go语言(Golang)1.26.0
Go语言(Golang)1.26.0

Go语言(Golang)1.26.0版本官方下载,版本号 1.26.0,适合旧项目维护、兼容性测试和指定版本开发环境搭建。

下载

表达式赋值 (ExpressionList =)

表达式赋值允许我们将range迭代的结果赋给一个已经存在的变量,或者一个更复杂的表达式所指向的内存位置。这种方式不声明新变量,而是修改现有存储。

核心特点:

  • 标准赋值: 使用=操作符。这意味着左侧的表达式必须解析为一个可赋值的存储位置。
  • 修改现有存储: 迭代值不会创建新变量,而是更新由左侧表达式指定的内存地址上的值。
  • 左侧必须可寻址: 左侧的表达式必须是“可寻址的”(addressable),例如一个变量、一个结构体字段、一个数组元素,或者一个解引用后的指针。

示例代码1:赋值给解引用指针

这个例子展示了如何将range迭代的索引值赋给一个通过指针间接引用的整数变量。

package main

import "fmt"

func main() {
    var i = 0 // 声明一个已存在的整数变量
    p := &i   // p 是 i 的指针

    // 将 range 迭代的索引值赋值给 *p (即 i 所指向的内存位置)
    for *p = range []int{10, 20, 30} {
        fmt.Printf("变量 i 的当前值: %d\n", i)
    }
    // 输出:
    // 变量 i 的当前值: 0  (第一次循环,*p=0)
    // 变量 i 的当前值: 1  (第二次循环,*p=1)
    // 变量 i 的当前值: 2  (第三次循环,*p=2)
}

在这里,*p是一个表达式,它表示指针p所指向的内存位置。每次range循环迭代时,它将当前的索引值(0, 1, 2)赋给*p,从而修改了变量i的值。

示例代码2:赋值给函数返回的解引用指针

更进一步,左侧的表达式可以是函数调用的结果,只要该结果是一个可寻址的指针,并且我们对其进行解引用。

package main

import "fmt"

var globalInt = 0 // 声明一个全局变量

// foo 函数返回 globalInt 的指针
func foo() *int {
    return &globalInt
}

func main() {
    // 将 range 迭代的索引值赋值给 *foo() (即 globalInt 所指向的内存位置)
    for *foo() = range []int{100, 200, 300} {
        fmt.Printf("全局变量 globalInt 的当前值: %d\n", globalInt)
    }
    // 输出:
    // 全局变量 globalInt 的当前值: 0
    // 全局变量 globalInt 的当前值: 1
    // 全局变量 globalInt 的当前值: 2
}

在这个例子中,*foo()是一个更复杂的表达式。foo()函数返回globalInt变量的地址,然后通过*操作符解引用该地址,使其成为一个可赋值的左值。range循环的每次迭代都会将索引值赋给globalInt。

注意事项与总结

  • 操作符选择: 区分:=和=是关键。:=用于声明新变量,=用于赋值给现有变量或表达式解析出的存储位置。
  • 作用域: 使用:=声明的标识符是局部于for循环体的新变量。使用=赋值的表达式通常指向循环体外部已存在的变量,或者一个在循环迭代过程中被修改的共享内存位置。
  • 左侧可寻址性: 当使用=进行表达式赋值时,左侧的表达式必须能够解析为一个可寻址的内存位置。这意味着它不能是字面量(如1 = range ...是无效的),也不能是不可修改的常量,或者一个纯右值表达式。
  • 灵活性: 表达式赋值提供了极大的灵活性,允许我们在range循环中直接操作指针、结构体字段、数组元素等,而无需额外的中间变量。

理解range循环中标识符与表达式赋值的区别,能够帮助Go开发者编写更精确、更高效且意图更明确的代码。选择哪种方式取决于你希望在循环中如何处理迭代值:是为它们创建新的临时存储,还是更新已有的数据结构。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6224

2023.10.24

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16180

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1183

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

8870

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

3522

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1838

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2904

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6224

2023.10.24

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn