So far things work well, but there is one thing I can not wrap my head around.
Certain commands, like Rcpt() are specified to return error but actually return *SMTPError.
So when I write code that accesses the specific fields and functions of SMTPError,
the compiler tells me that these are undefined, since it expects error.
I don’t even know what to google for. Are there any examples on how to work with
a generic error that’s “overwritten” by a module-specific error? All pointers welcome.
For an expression x of interface type and a type T, the primary expression
x.(T)
asserts that x is not nil and that the value stored in x is of type T. The notation x.(T) is called a type assertion.
A type assertion used in an assignment or initialization of the special form
v, ok = x.(T) v, ok := x.(T) var v, ok = x.(T) var v, ok T1 = x.(T)
yields an additional untyped boolean value. The value of ok is true if the assertion holds. Otherwise it is false and the value of v is the zero value for type T. No run-time panic occurs in this case.
smtpErr, ok := err.(*smtp.SMTPError)
if ok {
fmt.Println(smtpErr)
}
Coming from a language like Perl, these things still trip me up.
I am starting to see the advantages of strict typing, but it still has a learning curve.