Golang Go语言中请教一个继承中的mutex问题。

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中请教一个继承中的mutex问题。
package main

import (
“fmt”
“sync”
)

type A struct {
name string
mu sync.Mutex
}
func (a *A) Say(){
a.mu.Lock()
defer a.mu.Unlock()
fmt.Printf(“A: %v\n”,a.name)
}

type B struct{
A
}
func (b *B) Say(){
fmt.Printf(“B: %v\n”,b.name)
}


func main() {
a := A{name:“joe”}
a.Say()
b := B{a}
b.Say()
}



b := B{a} 报错,请文有没有其他方式可以解决


更多关于Golang Go语言中请教一个继承中的mutex问题。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

解决了,改用指针就可以

更多关于Golang Go语言中请教一个继承中的mutex问题。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


没有报错吧…有个提示修改?

没发现有问题呀

https://play.golang.org/p/Z9V9du-qu8f 报了个 literal copies lock value from a: play.A contains sync.Mutex

互斥锁,复制是有问题 de

受教了,以后全部用*sync.Mutex

理解错了吧,这里应该是用 A 的指针作为成员。不是说 要用 *sync.Mutex 。
type B struct {
*A
}
然后初始化用传进去指针。话说 V2EX 连个格式化代码功能都没有么

在Go语言中,需要澄清一点:Go并不支持传统面向对象编程中的“继承”概念,而是采用了组合(Composition)和接口(Interface)来实现代码的复用和抽象。不过,针对你提到的关于mutex(互斥锁)的问题,我可以提供一些常见的使用模式和最佳实践。

在Go中,sync.Mutex常用于保护共享资源,避免数据竞争。当你需要在结构体中嵌入一个互斥锁来保护其字段时,可以通过组合的方式来实现。例如:

package main

import (
	"fmt"
	"sync"
)

type SafeCounter struct {
	mu    sync.Mutex
	value int
}

func (c *SafeCounter) Increment() {
	c.mu.Lock()
	c.value++
	c.mu.Unlock()
}

func (c *SafeCounter) Value() int {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.value
}

func main() {
	counter := SafeCounter{}
	counter.Increment()
	fmt.Println(counter.Value()) // 输出: 1
}

在这个例子中,SafeCounter结构体通过嵌入sync.Mutex来确保对其value字段的并发安全访问。注意,每次访问共享资源时,都需要显式地加锁和解锁。

如果你正在尝试模拟“继承”中的行为,并希望复用mutex逻辑,可以考虑将mutex和相关方法封装在一个基础结构体中,然后通过组合将其引入到你需要的结构体中。这样可以保持代码的清晰和可维护性。

回到顶部