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
在这一行遇到了这个错误:
.\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 变量的作用域。在 if 和 else 块中声明的 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 调用时就能正确访问到它。

