【golang】关于for range 中只存储最后一个元素的问题

前言

搬运下自己博客园的文章~

今天用for range写了个demo,发现无论怎么运行,最后的结果是一直是最后一个。自己思考过后,又和其他伙伴商量了下,最终算是解决了自己的疑惑。

正文

下面我们来看个例子:

m := make(map[int]*int)
    arr := []int{1, 2, 3, 4, 5}
    for i, v := range arr {
        m[i] = &v
    }
    for k, v := range m {
        fmt.Println("k-->v", k, *v)
    }

大家思考下最后的结果…

放出答案,因为map是无序的,我们只考虑value即可。发现value的值是5,和理想中的不一样。
这是图
如果你对这个问题也感觉到疑惑,那就跟着我来一探究竟吧~

for range的特性:

for range 每次都是拷贝原变量的副本,也就是值拷贝。

在上述题目过程中,我们拷贝的并不是arr[i]对应的地址,而是变量v的地址。你可能说变量v不就是arr[i]嘛,答案是并不是,v只不过是一个临时变量罢了。上面的代码其实等价于:

m := make(map[int]*int)
    arr := []int{1, 2, 3, 4, 5}
    for i, v := range arr {//    v 临时变量,负责值拷贝
        v = arr[i] //    最后存入的是v的地址,v每次循环过程中值都在改变,所以最后结果是5
        m[i] = &v
    }
    for k, v := range m {
        fmt.Println("k-->v", k, *v)
    }

博主对于for range遍历每次都是最后一个值的理解大概就是这样,如果有错误,欢迎指出~

| 不骄不躁,保持学习

Go语言(Golang)中创建哈希表非常简单直观。Go内置了map类型用于表示关联数组或哈希表,其中每个元素都由一个键和对应的组成。以下是几种常见的初始化方式: #### 定义空Map 最基础的方式就是声明一个未指定大小的空map变量,并使用make函数分配内存空间给它: ```go // 方式一:先声明后初始化 var m map[string]int // 声明了一个string->int类型的map m = make(map[string]int) // 初始化该map // 方式二:一步到位 m := make(map[string]int) ``` 这里`string`是要存储作为key的数据类型,而`int`则是value的数据类型。 #### 直接赋初 如果已经知道了部分键对信息,可以一次性完成定义与填充操作: ```go ages := map[string]int{ "Alice": 30, "Bob": 25, } ``` 这种方式非常适合于静态配置场景下构建小型映射表。 #### 添加、获取及删除元素 接下来演示如何在这个新建的地图上进行基本的操作: ```go package main import ( "fmt" ) func main() { ages := map[string]int{} // 插入/更新一条记录 ages["Charlie"] = 40 fmt.Println("Charlie's age:", ages["Charlie"]) // 获取存在的记录 _, exists := ages["David"] if !exists { fmt.Println("'David' does not exist.") } delete(ages, "Charlie") // 删除某个条目 value, ok := ages["Charlie"]; // 检查是否删除成功 if !ok || value == 0 { // 注意检查第二个返回以确认查找结果有效性 fmt.Printf("After deletion, 'Charlie': %v\n", ok) } for key, val := range ages { // 遍历打印剩余的所有记录 fmt.Printf("%s -> %d\n", key,val ) } } ``` 上述代码展示了怎样插入新项目、查询已有的键对应之数、测试是否存在某特定标识符及其相应内容,还有清除此条目的过程。 通过以上步骤,您就可以轻松地在您的程序里引入并高效管理hash table啦!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值