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 回复

谢谢,我会尝试安装一个。

更多关于Golang中绑定字符串值时遇到未知错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


补充一点,如果你使用代码检查工具(可能集成在你的IDE中),它将帮助你避免这类问题。

谢谢,现在明白了。 smiley

当你在 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语句中修改外部作用域的变量时,应该先声明变量,然后使用赋值操作。

回到顶部