Golang中的Sprintf访问段冲突

I encontered the segmentation violation error when I use Sprintf in my golang code. Anyboy know what's wrong with my code? My code as following:


func createTrainingPath(trainingPrefix string, uuid string, codec string) string {
    return fmt.Sprintf("%s/%s/%s/%s", trainingPrefix, codec, time.Now().Format("20060102"), uuid)
}

The error as following:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x6ca1f7]

goroutine 7483565 [running]:
panic(0x1162ea0, 0x19558e0)
        /home/wenchuang.liu/go/src/runtime/panic.go:540 +0x45e fp=0xc494a569f0 sp=0xc494a56948 pc=0x697f4e
runtime.panicmem()
        /home/wenchuang.liu/go/src/runtime/panic.go:63 +0x5e fp=0xc494a56a10 sp=0xc494a569f0 pc=0x696c7e
runtime.sigpanic()
        /home/wenchuang.liu/go/src/runtime/signal_unix.go:367 +0x17c fp=0xc494a56a60 sp=0xc494a56a10 pc=0x6af2dc
runtime.memmove(0xc4200e2419, 0x0, 0x20)
        /home/wenchuang.liu/go/src/runtime/memmove_amd64.s:178 +0x147 fp=0xc494a56a68 sp=0xc494a56a60 pc=0x6ca1f7
fmt.(*buffer).WriteString(...)
        /home/wenchuang.liu/go/src/fmt/print.go:82
fmt.(*fmt).padString(0xc47dafe040, 0x0, 0x20)
        /home/wenchuang.liu/go/src/fmt/format.go:110 +0x9c fp=0xc494a56af0 sp=0xc494a56a68 pc=0x7365fc
fmt.(*fmt).fmt_s(0xc47dafe040, 0x0, 0x20)
        /home/wenchuang.liu/go/src/fmt/format.go:328 +0x61 fp=0xc494a56b28 sp=0xc494a56af0 pc=0x7373a1
fmt.(*pp).fmtString(0xc47dafe000, 0x0, 0x20, 0x7f3300000073)
        /home/wenchuang.liu/go/src/fmt/print.go:433 +0x197 fp=0xc494a56b60 sp=0xc494a56b28 pc=0x73b077
fmt.(*pp).printArg(0xc47dafe000, 0x1131bc0, 0xc4c6f94200, 0x73)
        /home/wenchuang.liu/go/src/fmt/print.go:664 +0x7b5 fp=0xc494a56be0 sp=0xc494a56b60 pc=0x73d355
fmt.(*pp).doPrintf(0xc47dafe000, 0x1232d53, 0xb, 0xc494a56dd0, 0x4, 0x4)
        /home/wenchuang.liu/go/src/fmt/print.go:996 +0x15a fp=0xc494a56d10 sp=0xc494a56be0 pc=0x740cea
fmt.Sprintf(0x1232d53, 0xb, 0xc494a56dd0, 0x4, 0x4, 0xc4c48478d8, 0x8)
        /home/wenchuang.liu/go/src/fmt/print.go:196 +0x66 fp=0xc494a56d68 sp=0xc494a56d10 pc=0x739226
i7zuoye.com/ago/gomark/service/utils.createTrainingPath(0x0, 0x20, 0x122f9f1, 0x6, 0xc42c2c9560, 0xc4209e0f68)
        /home/wenchuang.liu/gohere/src/i7zuoye.com/ago/gomark/service/utils/media.go:210 +0x190 fp=0xc494a56e20 sp=0xc494a56d68 pc=0xbdc6f0
i7zuoye.com/ago/gomark/service/utils.SaveResult(0x0, 0x20, 0xc4909e4a00, 0xf5e, 0x134f, 0x865823, 0xc4206b0301, 0xc4209e0fa8, 0x865823)
        /home/wenchuang.liu/gohere/src/i7zuoye.com/ago/gomark/service/utils/media.go:116 +0x51 fp=0xc494a56e98 sp=0xc494a56e20 pc=0xbdaf41
i7zuoye.com/ago/gomark/service/evaluate/stream.sendResponse.func1(0xc4acdfbe60, 0xc4909e4a00, 0xf5e, 0x134f, 0xc4371bc410, 0xc8, 0x0, 0x0, 0x0, 0x12392fd, ...)
        /home/wenchuang.liu/gohere/src/i7zuoye.com/ago/gomark/service/evaluate/stream/streamserver.go:390 +0x73 fp=0xc494a56f40 sp=0xc494a56e98 pc=0xbf3593
runtime.goexit()
        /home/wenchuang.liu/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc494a56f48 sp=0xc494a56f40 pc=0x6c9901
created by i7zuoye.com/ago/gomark/service/evaluate/stream.sendResponse
        /home/wenchuang.liu/gohere/src/i7zuoye.com/ago/gomark/service/evaluate/stream/streamserver.go:389 +0x179

Any help would be appreciated.

douyan8266
douyan8266 根据您的建议,我找到了根本原因。当我在go例程中使用参数“uuid”调用函数“createTrainingPath”时,父例程将“uuid”重置为空,然后重用它。我误解了字符串作为golang中的值传递。
一年多之前 回复
dsdtszi0520538
dsdtszi0520538 这个问题的好指针。我将尝试更改传递参数的其他方式。但是复制并不容易。当我得到任何更新时,我将在这里分享。谢谢大家。
一年多之前 回复
doukong9316
doukong9316 作为记录,这是一个引起类似的运行时错误的操场示例:play.golang.org/p/WCdyMXLSu2R
一年多之前 回复
douhan4243
douhan4243 几乎没有什么可以导致此问题,大多数包括使用不安全和/或cgo。考虑到您正在进行并发,这也是数据竞争的可能结果。尝试使用竞赛检测器运行代码。
一年多之前 回复
dongshao6591
dongshao6591 go中的字符串具有标头,其中包含ptr和len。ptr是指向内存的指针,而len是字符串的长度。当我说一个nil字符串时,我的意思是ptr部分已损坏。
一年多之前 回复
doupa9062
doupa9062 三个参数都是字符串类型。我试图将“nil”传递给此函数,它将在输入函数之前断言错误。这是高并发服务代码的一部分,并且有很多go例程可以调用此函数。我不确定这是否是由于go例程引起的。
一年多之前 回复
dongxun1978
dongxun1978 从这行i7zuoye.com/ago/gomark/service/utils.createTrainingPath(0x0、0x20、0x122f9f1、0x6、0xc42c2c9560、0xc4209e0f68)在我看来,您正在传递一个len=0x20的nil字符串作为trainingPrefix,它损坏了数据。
一年多之前 回复
douji4223
douji4223 createTrainingPath()的什么输入会引起恐慌?
一年多之前 回复
dor2p0520
dor2p0520 go1.9linux/amd64
一年多之前 回复
duanjianl183188
duanjianl183188 您正在使用哪个版本的go?
一年多之前 回复
douyong7199
douyong7199 然后,此代码不会产生该错误消息。
一年多之前 回复
dtukyb8095
dtukyb8095 时间在顶部导入,这是golang内置软件包
一年多之前 回复
dongruyan4948
dongruyan4948 时间是什么?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问