0

0

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

碧海醫心

碧海醫心

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

|

327人浏览过

|

来源于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。

表达式赋值 (ExpressionList =)

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

AskAI
AskAI

无代码AI模型构建器,可以快速微调GPT-3模型,创建聊天机器人

下载

核心特点:

  • 标准赋值: 使用=操作符。这意味着左侧的表达式必须解析为一个可赋值的存储位置。
  • 修改现有存储: 迭代值不会创建新变量,而是更新由左侧表达式指定的内存地址上的值。
  • 左侧必须可寻址: 左侧的表达式必须是“可寻址的”(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开发者编写更精确、更高效且意图更明确的代码。选择哪种方式取决于你希望在循环中如何处理迭代值:是为它们创建新的临时存储,还是更新已有的数据结构。

相关专题

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

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

1465

2023.10.24

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

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

180

2023.12.04

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

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

278

2024.02.23

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

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

253

2025.06.11

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

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

121

2025.08.07

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

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

256

2023.08.03

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

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

208

2023.09.04

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

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

1465

2023.10.24

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

2

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.8万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号