假設我有一個 type Connection,它代表一個 TCP 連接。建立連接是一個阻塞操作。我看到兩種設計其界面的方法,我的問題是哪一種在 Go 中更慣用:func NewConnection(...) (*Connection, error)阻止并返回已建立的連接。優點: 不能有 invalid Connections 閑逛。Connection內存中的任何一個都是已建立的、有效的連接。缺點:阻塞構造函數可能會令人驚訝。func NewConnection(...) Connection立即返回一個新的連接,我們需要調用一個阻塞func (c *Connection) Establish() error來實際建立連接。優點:非阻塞構造函數對我來說似乎更“正常”。缺點:人們可能會忘記打電話Establish。在這種情況下這是微不足道的,但如果類型很復雜并且我們需要對其進行大量配置(甚至可能需要按特定順序調用事物),這會給程序員帶來更大的機會搞砸。
1 回答

慕沐林林
TA貢獻2016條經驗 獲得超9個贊
正如評論所暗示的,阻塞構造函數沒有任何問題,但函數的命名應該反映它可能阻塞的事實。文檔也應該如此。
在標準庫中,如果您想創建一個新套接字并連接到某個服務器,您可以通過一次調用來完成:net.Dial
func Dial(network, address string) (Conn, error)
這是一個返回新的阻塞操作Conn
。
所以在 Go 中這樣做是慣用的,你應該正確命名它。我同意你的直覺,即#2 的可用性不太好。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報
0/150
提交
取消