美文网首页
golang使用指针修改数据引起的血案

golang使用指针修改数据引起的血案

作者: tonnyzhang | 来源:发表于2021-02-24 19:27 被阅读0次

背影知识:

golang 中的struct和slice为值赋值, map为引用赋值;range语句for k, v := range val 这里的v只申明了一次,每次迭代只会更新值

我们在平时应该会经常用到用指针把修改复杂对象(struct、slice、map)属性的需求,今天小编就把踩过的一个小坑跟大家分享下:

先上下代码:

package main

import (
    "fmt"
)

// Node node
type Node struct {
    Val int
}

var nodes []Node

func initData() {
    for i := 0; i < 10; i++ {
        nodes = append(nodes, Node{
            Val: i,
        })
    }

    nodes[9].Val = 100
}
func main() {

    initData()

    var mapNodes map[int][]*Node = make(map[int][]*Node, 0)

    for _, v := range nodes {
        if _, ok := mapNodes[v.Val]; !ok {
            mapNodes[v.Val] = make([]*Node, 0)
        }
        mapNodes[v.Val] = append(mapNodes[v.Val], &v)
    }

    node := mapNodes[0][0]
    node.Val = 200

    fmt.Println(nodes)
}

输出

[{0} {1} {2} {3} {4} {5} {6} {7} {8} {100}]

期望输出

[{200} {1} {2} {3} {4} {5} {6} {7} {8} {100}]

可以明显看出我们更改的第一个元素的值没有生效,第一个原因是range造成的问题,我们不能直接使用&v去作为指向原始元素的地址,此时想得到原始元素的地址,必须明确找到元素,可以使用以下方案:

    for i, v := range nodes {
        if _, ok := mapNodes[v.Val]; !ok {
            mapNodes[v.Val] = make([]*Node, 0)
        }
        mapNodes[v.Val] = append(mapNodes[v.Val], &(nodes[i]))
    }

修改完成后,再看下输出即是我们想要的结果

[{200} {1} {2} {3} {4} {5} {6} {7} {8} {100}]

其实range语句里的v即为一个赋值操作,等价于v := nodes[i],此时的赋值操作v已经是一个新的地址和原始数据nodes[i]已经不是同一个地址,故后续想通过&v是找不到原始数据的

相关文章

  • golang使用指针修改数据引起的血案

    背影知识:golang 中的struct和slice为值赋值, map为引用赋值;range语句for k, v ...

  • golang 指针

    1.Golang提供了指针用于操作数据内存,并通过引用来修改变量。只声明未赋值的变量,golang都会自动为其初始...

  • 修改稿引起的血案

    11点回到家,刚脱下鞋,老板电话就过来催修改稿,我:等等修给你。。 我想着去趟厕所再回来好好工作,结果遇上了刚拖过...

  • go问题整理

    初学golang,记录下日常遇到的问题 golang struct 字段是否被赋值 使用指针类型解决,代码示例 g...

  • Go 学习笔记 07 | 指针详解

    一、Golang 中的指针 指针存储的是另一个变量的内存地址。 通过指针修改值会影响到原来的值。 输出: 如何去改...

  • 常量指针和指针常量

    1、常量指针 定义:只能读取内存中数据,不能修改内存中数据的指针。称为指向常量的指针,简称常量指针 声明:cons...

  • golang 指针类型引起的神奇 bug

    下面是使用的结构体接口抽象定义,其实就是将结构体存进一个 map里。由于是读写都比较频繁,我加了读写锁。 结构体定...

  • Golang基础(三)——复杂类型

    Golang基础(三)——复杂类型 @([07] golang)[Go总结] [TOC] 指针 定义 指针变量可以...

  • golang如何修改json文件内容

    golang如何修改json文件内容 使用一个例子说明golang如何访问和修改json文件;主要分三步: 从文件...

  • 安装docker和docker-compose

    安装docker 修改数据目录 设置 docker/compose 设置docker的golang 环境

网友评论

      本文标题:golang使用指针修改数据引起的血案

      本文链接:https://www.haomeiwen.com/subject/upmsfltx.html