首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >共享了 err 这个变量怎么实现

共享了 err 这个变量怎么实现

原创
作者头像
用户7365393
修改2021-10-08 14:12:33
修改2021-10-08 14:12:33
5940
举报

分析: 使用 go run -race main.go 执行,可以发现这里报错的地方是,21 行和 28 行,有 data race,这里主要是因为共享了 err 这个变量

root@failymao:/mnt/d/gopath/src/Go_base/daily_test/data_race# go run -race demo2.go

==================

WARNING: DATA RACE

Write at 0x00c0001121a0 by main goroutine:

main.ParallelWrite()

/mnt/d/gopath/src/Go_base/daily_test/data_race/demo2.go:28 +0x1dd

main.main()

/mnt/d/gopath/src/Go_base/daily_test/data_race/demo2.go:6 +0x84

Previous write at 0x00c0001121a0 by goroutine 7:

main.ParallelWrite.func1()

/mnt/d/gopath/src/Go_base/daily_test/data_race/demo2.go:21 +0x94

Goroutine 7 (finished) created at:

main.ParallelWrite()

/mnt/d/gopath/src/Go_base/daily_test/data_race/demo2.go:19 +0x336

main.main()

/mnt/d/gopath/src/Go_base/daily_test/data_race/demo2.go:6 +0x84

==================

Found 1 data race(s)

exit status 66

修正: 在两个goroutine中使用新的临时变量

_, err := f1.Write(data)

...

_, err := f2.Write(data)

...

2.4 不受保护的全局变量

所谓全局变量是指,定义在多个函数的作用域之外,可以被多个函数或方法进行调用,常用的如 map数据类型

// 定义一个全局变量 map数据类型

var service = map[string]string{}

// RegisterService RegisterService

// 用于写入或更新key-value

func RegisterService(name, addr string) {

service[name] = add

}

// LookupService LookupService

// 用于查询某个key-value

func LookupService(name string) string {

return service[name]

}

要写出可测性比较高的代码就要少用或者是尽量避免用全局变量,使用 map 作为全局变量比较常见的一种情况就是配置信息。关于全局变量的话一般的做法就是加锁,或者也可以使用 sync.Ma

var (

service map[string]string

serviceMu sync.Mutex

)

func RegisterService(name, addr string) {

serviceMu.Lock()

defer serviceMu.Unlock()

service[name] = add

}

func LookupService(name string) string {

serviceMu.Lock()

defer serviceMu.Unlock()

return service[name]

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档