Golang range slice 与range array 之间的区别
作者:??凡森Zfans??? 发布时间:2024-05-21 10:26:31
标签:Golang,range,slice,range,array
结构图:
为什么?
var data [][]int
for _, rangeSlice := range [][]int{{1}, {2}, {3}} {
data = append(data, rangeSlice[:])
}
fmt.Printf("%v", data) // 输出 [[1] [2] [3]]
var data [][]int
for _, rangeArray := range [][1]int{{1}, {2}, {3}} {
data = append(data, rangeArray[:])
}
fmt.Printf("%v", data) // 输出 [[3] [3] [3]]
理解
for key, value := range container{
// loop
}
在 for range
语法中,value
是 for range
循环返回元素的值的拷贝。
case rangeSlice
var data [][]int
for _, rangeSlice := range [][]int{{1}, {2}, {3}} {
data = append(data, rangeSlice[:])
}
fmt.Printf("%v", data) // 输出 [[1] [2] [3]]
代码中,rangeSlice
是切片 []int{1}
or []int{2}
or []int{3}
的一个拷贝,底层是数组 [1]int{1}
or [1]int{2}
or [1]int{3}
,所以在 rangeSlice
的切片 append
到 data
后,data
的元素也是这几个底层数组的切片,所以上述代码片段的输出为 [[1] [2] [3]]
。
case rangeArray
var data [][]int
for _, rangeArray := range [][1]int{{1}, {2}, {3}} {
data = append(data, rangeArray[:])
}
fmt.Printf("%v", data) // 输出 [[3] [3] [3]]
代码中,rangeArray
是数组 [1]int{1}
or [1]int{2}
or [1]int{3}
的一个拷贝,在每次循环中,rangeArray
用的都是同一个数组内存空间,所以在 rangeArray
这个数组的切片 append
到 data
后,data
的元素都是指向同一底层数组的切片,在循环的最后一轮 rangeArray
为 [1]int{3}
,所以上述代码片段的输出为 [[3] [3] [3]]
。
测试代码
package main
import "fmt"
func rangeSlice() {
source := [][]int{{1}, {2}, {3}}
var data [][]int
for idx, rangeSlice := range source {
fmt.Printf("%T %p %T %p", rangeSlice, rangeSlice, source[idx], source[idx])
fmt.Printf(" append slice %p\n", rangeSlice[:])
data = append(data, rangeSlice[:])
}
fmt.Printf("data: %v\n", data)
}
func rangeArray() {
source := [][1]int{{1}, {2}, {3}}
var data [][]int
for idx, rangeArray := range source {
fmt.Printf("%T %p %T %p", rangeArray, &rangeArray, source[idx], &source[idx])
fmt.Printf(" append slice %p\n", rangeArray[:])
data = append(data, rangeArray[:])
}
fmt.Printf("data: %v\n", data)
}
func main() {
rangeSlice()
rangeArray()
}
// 输出:
// []int 0xc00001a0a8 []int 0xc00001a0a8 append slice 0xc00001a0a8
// []int 0xc00001a0b0 []int 0xc00001a0b0 append slice 0xc00001a0b0
// []int 0xc00001a0b8 []int 0xc00001a0b8 append slice 0xc00001a0b8
// data: [[1] [2] [3]]
// [1]int 0xc00001a0e0 [1]int 0xc0000160f0 append slice 0xc00001a0e0
// [1]int 0xc00001a0e0 [1]int 0xc0000160f8 append slice 0xc00001a0e0
// [1]int 0xc00001a0e0 [1]int 0xc000016100 append slice 0xc00001a0e0
// data: [[3] [3] [3]]
来源:https://juejin.cn/post/7120078796845219871


猜你喜欢
- 这篇文章主要介绍了Python如何实现强制数据类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 样式表是一种为超文本标签语言提供增强补充服务的技术,可对每一个html的标签做精雕细刻的修饰。只用html制作的网页,对页面内各部分的修饰能
- 1.方法说明 , Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,r
- Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护sessio
- 一、seaborn概述Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用sea
- 目录一.models数据库映射二.serializers序列化三.url路由四.Views视图类一.models数据库映射from djan
- 前言 在我们学习C语言时,我们学了
- 模拟动态产生字母验证码图片模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理。这里介绍一下 Python 提供的 Pillo
- 阅读系列教程上一篇:FrontPage2002简明教程二:文字与图像的处理通常网页的布局使用到的是FrontPage 2002中的表格和框架
- 使用python基于cartopy库绘制台风路径使用python 绘制西太平洋进入我国的台风路径,文件为.dat格式,内容如下所示:代码如下
- 这篇文章主要介绍了Python函数参数类型及排序原理总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 先来说说实现方式: 1、我们来假定Table中有一个已经建立了索引的主键字段ID(整数型),我们将按照这个字段来取数据进行分页。 2、页的大
- 在域环境下我没配置成果,也许是域用户的原因,因为我在生产环境下搞的,更改域用户需要重启SQLServer ,所以这个方法放弃了,只能用证书形
- 本文实例讲述了Python实现输出某区间范围内全部素数的方法。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-
- 本文为大家分享了oracle11g安装图文教程,供大家参考,具体内容如下0、安装环境1、安装包下载1)http://www.oracle.c
- Python使用for实现无限循环# 方法1.1:借助循环遍历列表的cycle方法from itertools import cyclefo
- 一、文本文件读取与写入1 读取文件的 read() 方法file_object.read([size])file_object 表示文件对象
- 假设红包金额为money,数量是num,并且红包金额money>=num*0.01原理如下,从1~money*100的数的集合中,随机
- 本文实例为大家分享了python树莓派红外反射传感器的程序,供大家参考,具体内容如下1、工具rpi3,微雪ARPI600,Infrared
- 外部临时表通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束