2017-06-06 100 views
0

我使用gomail.v2來發送電子郵件,我的代碼工作正常。撰寫郵件msg後,我可以只運行用gomail.v2創建一個新的*撥號器

import ("gopkg.in/gomail.v2") 

    ... 
    d := gomail.NewDialer("smtp.example.com", 25, "username", "password") 
    return d.DialAndSend(msg) 
} 

當然,我想概括過去的這個特定的用戶名和密碼,並將其分成其自身的功能,所以我掐滅出來:

import ("gopkg.in/gomail.v2") 

    ... 
    d := MyDialer() 
    return d.DialAndSend(msg) 
} 

func MyDialer() *Dialer { 
    return gomail.NewDialer("smtp.example.com", 25, "username", "password") 
} 

但是呱呱叫,抱怨說它不知道Dialer。

\ email.go:42:未定義:撥號

這是爲什麼?我使用與NewDialer相同的返回類型,這不會導致任何問題。

func NewDialer(host string, port int, username, password string) *Dialer 

我錯過了什麼?我跑

去拿-u gopkg.in/gomail.v2

,以確保我沒有莫名其妙的跑出來的包的最新版本,但沒有運氣。

回答

2

*Dialer*gomail.Dialer是2種不同的類型。具體錯誤是因爲您的包中沒有定義Dialer類型,但您需要匹配簽名中的類型,而不僅僅是名稱。由於gomail.NewDialer返回*gomail.Dialer,請使用:

func MyDialer() *gomail.Dialer { 
+0

完美,謝謝!作爲一個初學者(這真的是我的第一個項目),我怎麼能自己發現這個呢?我不想在SO上問一堆愚蠢的問題。 :) – Charles

+1

@Charles:你會很快解釋編譯器錯誤,而且它們通常都很好(儘管通常丟失的大括號仍然可以拋出非常差的東西)。 'undefined:Dialer'意味着你的包裏沒有'Dialer',因爲它不是你打算自己聲明的東西,它必須是錯誤的類型。由於導入包中的所有內容都必須以包標識符作爲前綴,因此'gomail'中的'Dialer'必須被引用爲'gomail.Dialer'。 – JimB