Golang中字段无法访问的问题如何解决

Golang中字段无法访问的问题如何解决 我不是Go程序员,但我需要修改一些代码。在这段代码中:

// sendmail invokes go's sendmail method
func sendmail(payload []byte, sendTo []string) (err error) {

	if cfg.Mail.SMTPAuth {
		auth := smtp.PlainAuth(
		"",
		cfg.Mail.Username,
		cfg.Mail.Password,		
		cfg.Mail.SMTPRelay)	//not thru tor
		} else {
		auth := smtp.PlainAuth(
		"",
		cfg.Mail.Username,
		cfg.Mail.Password,
		"")					//thru tor
		}

   relay := fmt.Sprintf("%s:%d", cfg.Mail.SMTPRelay, cfg.Mail.SMTPPort)
   err = smtp.SendMail(relay, auth, cfg.Remailer.Address, sendTo, payload)
   if err != nil {
      Warn.Println(err)
      return
   }
   return
}

我遇到了这个错误: $ go build .\mail.go:450:31: undefined: auth

第450行 = smtp.SendMail… 这一行。

之前 auth := 没有包裹在if语句中,但我需要根据if测试来更改auth。如果你能展示如何仅更改auth的最后一行(cfg.Mail.SMTPRelay)为“”并恢复原样,那也可以解决问题。 有人能展示如何绕过这个错误吗?

谢谢


更多关于Golang中字段无法访问的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

在这一行遇到了这个错误:

.\mail.go:449:5: 语法错误:函数体外部的非声明语句 第 449 行 =

host := ""

更多关于Golang中字段无法访问的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


声明 auth 变量,然后在 if 语句中为其赋值。

var auth whatever

if cond {
  auth = foo
} else {
  auth = bar
}

如果你能展示如何仅在身份验证部分(cfg.Mail.SMTPRelay)将最后一行改为空字符串("")然后再改回来,那也可以。

试试这个:

// sendmail invokes go's sendmail method
func sendmail(payload []byte, sendTo []string) (err error) {
	host := "" // thru tor
	if cfg.Mail.SMTPAuth {
		host = cfg.Mail.SMTPRelay // not thru tor
	}
	auth := smtp.PlainAuth(
		"",
		cfg.Mail.Username,
		cfg.Mail.Password,
		host,
	)

	relay := fmt.Sprintf("%s:%d", cfg.Mail.SMTPRelay, cfg.Mail.SMTPPort)
	err = smtp.SendMail(relay, auth, cfg.Remailer.Address, sendTo, payload)
	if err != nil {
		Warn.Println(err)
		return
	}
	return
}

这个有效了 /petrus - 谢谢!

// sendmail invokes go's sendmail method
func sendmail(payload []byte, sendTo []string) (err error) {
	var auth smtp.Auth
	if cfg.Mail.SMTPAuth {
		auth = smtp.PlainAuth(
			"",
			cfg.Mail.Username,
			cfg.Mail.Password,
			cfg.Mail.SMTPRelay) //not thru tor
	} else {
		auth = smtp.PlainAuth(
			"",
			cfg.Mail.Username,
			cfg.Mail.Password,
			"") //thru tor
	}

	relay := fmt.Sprintf("%s:%d", cfg.Mail.SMTPRelay, cfg.Mail.SMTPPort)
	err = smtp.SendMail(relay, auth, cfg.Remailer.Address, sendTo, payload)
	if err != nil {
		Warn.Println(err)
		return
	}
	return
}

battles 说:

我遇到了这个错误: $ go build .\mail.go:450:31: undefined: auth

试试这个:

// sendmail invokes go's sendmail method
func sendmail(payload []byte, sendTo []string) (err error) {
	var auth smtp.Auth
	if cfg.Mail.SMTPAuth {
		auth = smtp.PlainAuth(
			"",
			cfg.Mail.Username,
			cfg.Mail.Password,
			cfg.Mail.SMTPRelay) //not thru tor
	} else {
		auth = smtp.PlainAuth(
			"",
			cfg.Mail.Username,
			cfg.Mail.Password,
			"") //thru tor
	}

	relay := fmt.Sprintf("%s:%d", cfg.Mail.SMTPRelay, cfg.Mail.SMTPPort)
	err = smtp.SendMail(relay, auth, cfg.Remailer.Address, sendTo, payload)
	if err != nil {
		Warn.Println(err)
		return
	}
	return
}

问题在于 auth 变量的作用域。在 ifelse 块中声明的 auth 变量只在各自的作用域内有效,导致 smtp.SendMail 调用时 auth 未定义。

解决方案是在 if 语句外部声明 auth 变量,然后在条件分支中赋值:

func sendmail(payload []byte, sendTo []string) (err error) {
    var auth smtp.Auth
    
    if cfg.Mail.SMTPAuth {
        auth = smtp.PlainAuth(
            "",
            cfg.Mail.Username,
            cfg.Mail.Password,
            cfg.Mail.SMTPRelay) // not thru tor
    } else {
        auth = smtp.PlainAuth(
            "",
            cfg.Mail.Username,
            cfg.Mail.Password,
            "") // thru tor
    }

    relay := fmt.Sprintf("%s:%d", cfg.Mail.SMTPRelay, cfg.Mail.SMTPPort)
    err = smtp.SendMail(relay, auth, cfg.Remailer.Address, sendTo, payload)
    if err != nil {
        Warn.Println(err)
        return
    }
    return
}

这样修改后,auth 变量在整个函数作用域内都有效,smtp.SendMail 调用时就能正确访问到它。

回到顶部