美文网首页Go
golang 指针对象 和值对象

golang 指针对象 和值对象

作者: wuhan_goer | 来源:发表于2022-03-28 23:45 被阅读0次

看下面一段代码

package main

import (
    "fmt"
    "sync"
    "time"
)

type Foo struct {
    sync.RWMutex
    m map[int]int
}

func (f Foo) PointerMethod(i int) {
    f.RWMutex.Lock()
    f.m[i] = i
    f.RWMutex.Unlock()
}

func (f Foo) ValueMethod(i int) {
    f.RWMutex.Lock()
    fmt.Println(f.m[i])
    f.RWMutex.Unlock()
}

func main() {
    f1 := Foo{
        m: make(map[int]int, 0),
    }
    for i := 0; i < 100; i++ {
        go f1.ValueMethod(i)
        go f1.PointerMethod(i)
    }
    time.Sleep(6 * time.Second)

}

执行的结果是:panic 并发读写了 concurrent map writes


image.png

出现这种问题是因为采用了值对象导致加锁失败,

原因:

如果方法接收者为对象的指针,则会修改原对象,如果方法接收者为对象的值,那么在方法中被操作的是原对象的副本,不会影响原对象

官方也给了建议:

如果接收者是一个包含 sync.Mutex 或类似同步字段的结构,则接收者必须是一个指针以避免复制。


image.png

解决方法

改成指针即可


image.png

相关文章

  • golang 指针对象 和值对象

    看下面一段代码 执行的结果是:panic 并发读写了 concurrent map writes 出现这种问题是因...

  • 15章:内存与对象

    对象与内存 15.1指针和指针的值 对象只能通过指针访问,所以人们常用指向对象的指针来称呼该对象,例如有时候说“n...

  • iOS小笔记本

    strong和weak strong修饰的指针变量指向对象时,当指针指向新值或者指针不复存在,相关联的对象就会自动...

  • const

    const 和 *const 在前,则不能更改对象值,但可以更改指针所指对象;const 在后,则不能更改指针所指...

  • NSObject本质(五)isa指针与superClass指针

    在上篇文章中,我们了解到OC对象分为实例对象、类对象和元类对象三种。 实例对象主要存放有isa指针和成员变量的值;...

  • 指针

    1.对指针赋值 2过指针修改值 -----------------------oc对象 指针理解---------...

  • iOS-空指针,野指针,僵尸对象

    浅谈一下空指针,野指针,僵尸对象。 空指针:没有存储任何内存地址的指针,空指针的值是0; 野指针:指针指向的对象已...

  • LLDB学习

    p p/s 输出地址和具体的值 po输出具体的值(oc里所有的对象都是用指针表示的,打印出来的是对象的指针,而不是...

  • [C++之旅] 16 对象指针/对象成员指针/this指针

    [C++之旅] 16 对象指针/对象成员指针/this指针 一、对象指针 对象指针指向堆中地址 对象指针指向栈中地...

  • 如何Check僵尸对象

    野指针和僵尸对象 野指针: C语言:当我们声明一个指针变量,没有为这个指针变量赋初始值,这个指针变量的值是一个垃圾...

网友评论

    本文标题:golang 指针对象 和值对象

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