草庐IT

环境安全

全部标签

go - 一个 goroutine 从结构中读取而另一个 goroutine 正在修改它是否安全?

更具体地说,在我的例子中,我有一个网络服务器和一个全局可访问的结构,网络服务器使用它来生成页面。我有另一个Goroutine,它总是定期用新值更新该结构。这会引起问题吗?我是否需要实现一种机制来确保它在更新时不被读取? 最佳答案 不,这正是不安全的定义,会被racedetector捕获如果你测试过它。您绝对需要同步访问,例如使用sync.Mutexorsync.RWMutex.如果始终拥有最新值并不重要,您还可以允许每个goroutine缓存结构的副本,然后每隔一段时间定期从“主”副本更新它们的副本经常。如果经常访问该结构,这有助于

go - 如何确保自定义数据结构的编译时安全

我正在编写一些数据结构来尝试并了解Go语言,并且正在为Go缺乏泛型而苦苦挣扎。在我的实现中,我选择强制每个用户实现一个接口(interface),这样我的结构就可以抽象地引用这些对象,但我不喜欢我的解决方案,因为正如您将看到的那样,这在编译时没有得到验证。比较接口(interface)保存在容器中的每个对象都必须实现以下签​​名的比较函数(如果您想要保存的都是原始类型,那就麻烦了)typeComparerinterface{Compare(Comparer)int}然后您可以拥有实现接口(interface)的各种元素,如float64或自定义结构:float64typenumberf

go - 将一个 map 分配给另一个 map 在 golang 中是安全的吗?

代码如下:m:=make(map[interface{}]interface{})//readfori:=0;i有10000个readgoroutine访问m,另外10000个writegoroutine给m分配一个新的map,安全吗? 最佳答案 您有goroutines读取m变量,以及goroutines在没有显式同步的情况下写入m变量。这是一场数据竞赛,因此是未定义的行为。在启用竞争检测器的情况下运行它:$gorun-raceplay.go==================WARNING:DATARACEWriteat0x00

Go 语言环境和路径

我从github克隆的应用程序很少,但不确定我做的是否正确。我最近安装了go。$goGoisatoolformanagingGosourcecode.Usage:gocommand[arguments]Thecommandsare:buildcompilepackagesanddependenciescleanremoveobjectfilesdocshowdocumentationforpackageorsymbolenvprintGoenvironmentinformationfixrungotoolfixonpackagesfmtrungofmtonpackagesourcesg

go - 从指针并发读取是否安全?

我正在开发一个图片uploader,并希望同时将图片调整为不同的大小。一旦我将文件作为[]byte读取,我就会将该缓冲区的引用传递给正在同时运行的调整大小函数。这样安全吗?我在想通过传递一个大文件的引用来由调整大小函数读取会节省我的内存,并发会节省我的时间。谢谢! 最佳答案 只读数据通常适合并发访问,但在传递引用(指针、slice、映射等)时必须非常小心。今天,当您还在阅读时,也许没有人在修改它们,但明天可能有人会。如果这是一次性脚本,您会没事的。但如果它是更大程序的一部分,我建议通过明智地保护并发访问来使您的代码面向future。

docker - 如何将本地包导入docker环境

我尝试在Docker环境中运行GoAPI服务器,但它运行失败并出现错误。・client:react/axios・api:golang/gin・web-server:nginx・db:mysql・container:docker・ci-tool:travis・deploy:awselasticbeanstalkarticle├client├api│├main.go│├contoroller││└contoroller.go│└Dockerfile├nginx└docker-compose.yml这是api的Dockefile//article/api/DockefileFROMgolan

go - 我如何使用接口(interface)定义安全划分并反射(reflect)?

我想定义一个安全分区,例如:funcsafeDivide(a,binterface{})interface{}{ifb==0{return0}returna/b}很明显,这个功能是行不通的。我们不能划分界面。一种解决方案是判断输入的类型并进行除法。switchreflect.ValueOf(x).Kind(){casereflect.Int://balabala...虽然看起来很多余,但我必须处理每一个案子。那么我是否可以使用反射来保证输入的类型?我试过reflect.TypeOf()但失败了。顺便说一句,我注意到了这一点:a:=uint32(0)ifZero(a)//outputs"

docker - 在Dockerfile和docker-compose.yml中编写什么以在docker环境中传递本地包

我为服务器端api引入了localpackage和gomodules。通过命令gorunmain.go,它在本地环境中运行良好,没有错误。但是在命令docker-composeup时不起作用。我想知道编写Dockerfile和docker-compose.yml来修复什么。我在article目录下命令gomodinit。因此,它在go.mod中设置了modulegithub.com/jpskgc/article。article├db├client├api│├main.go│├controller││└controller.go│└Dockerfile├nginx├docker-comp

go - 在 Go 中安全地获取 slice 的一部分

我知道您可以通过以下方式在Go中获取slice的一部分test:=[]int{0,1,2,3,4}subsection:=test[:2]但是如果你尝试类似的东西subsectionError:=test[:10]你会得到一个越界错误。目前我正在做类似的事情length:=10iflen(test)为了避免这个错误,但是有更好的方法吗?这对我来说感觉很老套,但话又说回来,Go通常似乎是一种非常明确的语言。 最佳答案 在Go中,答案通常是在函数或方法中隐藏丑陋之处。例如,一个min函数,packagemainimport"fmt"fu

go - 如何优雅地使 slice 追加安全

slice:=[]int{10,20,30,40,50,60}newSlice:=slice[2:4:5]fmt.Printf("oldsliceis%d\n",slice)fmt.Printf("newsliceis%d\n",newSlice)newSlice=append(newSlice,70)fmt.Printf("oldsliceis%d\n",slice)fmt.Printf("newsliceis%d\n",newSlice)newSlice=append(newSlice,80)fmt.Printf("oldsliceis%d\n",slice)fmt.Printf(