Golang中绑定字符串值时遇到未知错误如何解决
Golang中绑定字符串值时遇到未知错误如何解决 大家好, 我遇到一个让我困惑且无法理解的问题。
var company_code string = ""
if model.CompanyCode == "" {
logger.Infof("GetDevices 1 (%s)", company_code) // 打印空字符串
company_code, err := utilities.GetStringValue(ctx, constants.CompanyCode)
test := company_code
logger.Infof("GetDevices test (%v)", test) // 打印 "test_code"
if err != nil {
logger.Errorf("Cannot get company_code")
}
logger.Infof("GetDevices company_code (%v)", company_code) // 打印 "test_code"
model.CompanyCode = company_code
} else {
model.CompanyCode = "hello_falling_back"
}
logger.Infof("CompanyCode: (%v)", company_code) // 打印空值 ????? 为什么????
logger.Infof("model.CompanyCode: (%v)", model.CompanyCode)` // 打印 "test_code"
更多关于Golang中绑定字符串值时遇到未知错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
5 回复
补充一点,如果你使用代码检查工具(可能集成在你的IDE中),它将帮助你避免这类问题。
谢谢,现在明白了。

当你在 if 语句块中使用 := 时,你创建了一个新的变量,它遮蔽了外部的 company_code,一旦离开该块,这个新变量就会超出作用域。
你可以通过预先声明 err,然后使用 = 进行赋值来解决这个问题。
这个问题是由于变量作用域导致的。在Go语言中,使用短变量声明操作符 := 会在当前作用域内创建一个新的变量,而不是修改外部作用域的变量。
在你的代码中,company_code, err := utilities.GetStringValue(ctx, constants.CompanyCode) 这一行创建了一个新的局部变量 company_code,它只在if语句块内有效。当离开if语句块后,你访问的是外部作用域的 company_code 变量,它仍然是空字符串。
以下是修正后的代码示例:
var company_code string = ""
if model.CompanyCode == "" {
logger.Infof("GetDevices 1 (%s)", company_code) // 打印空字符串
// 使用变量赋值而不是短变量声明
var err error
company_code, err = utilities.GetStringValue(ctx, constants.CompanyCode)
test := company_code
logger.Infof("GetDevices test (%v)", test) // 打印 "test_code"
if err != nil {
logger.Errorf("Cannot get company_code")
}
logger.Infof("GetDevices company_code (%v)", company_code) // 打印 "test_code"
model.CompanyCode = company_code
} else {
model.CompanyCode = "hello_falling_back"
}
logger.Infof("CompanyCode: (%v)", company_code) // 现在会打印 "test_code"
logger.Infof("model.CompanyCode: (%v)", model.CompanyCode) // 打印 "test_code"
或者,你也可以先声明err变量:
var company_code string = ""
if model.CompanyCode == "" {
logger.Infof("GetDevices 1 (%s)", company_code)
var localCompanyCode string
var err error
localCompanyCode, err = utilities.GetStringValue(ctx, constants.CompanyCode)
company_code = localCompanyCode
test := company_code
logger.Infof("GetDevices test (%v)", test)
if err != nil {
logger.Errorf("Cannot get company_code")
}
logger.Infof("GetDevices company_code (%v)", company_code)
model.CompanyCode = company_code
} else {
model.CompanyCode = "hello_falling_back"
}
logger.Infof("CompanyCode: (%v)", company_code)
logger.Infof("model.CompanyCode: (%v)", model.CompanyCode)
关键点:在Go中,:= 操作符会创建新的局部变量,而 = 操作符则是赋值给已存在的变量。当需要在if语句中修改外部作用域的变量时,应该先声明变量,然后使用赋值操作。


