Golang Go语言中请教一个继承中的mutex问题。
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
没发现有问题呀
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
和相关方法封装在一个基础结构体中,然后通过组合将其引入到你需要的结构体中。这样可以保持代码的清晰和可维护性。