返回多人的問候
在對模組程式碼進行的最後一次更改中,你將加入對一次請求中取得多人的問候的支援。換句話說,你將處理多值輸入,然後將該輸入中的值與多值輸出配對。為此,你需要將一組名字傳遞給一個函數,該函數可以為每個人返回一條問候語。
注意: 本文是系列教學的一部分,該系列始於 建立 Go 模組。
但這裡有一個問題。將 Hello 函數的參數從單個名字更改為一組名字會改變函數的簽名。如果你已經發布了 example.com/greetings 模組,而且使用者已經撰寫了呼叫 Hello 的程式碼,那麼這個更改會破壞他們的程式。
在這種情況下,更好的選擇是撰寫一個具有不同名稱的新函數。新函數將接受多個參數。這樣可以保留舊函數以實現向後相容性。
步驟
- 使用以下程式碼更新你的
greetings/greetings.go檔案:
在這段程式碼中,你:
- 加入了一個
Hellos函數,其參數是一個名字切片,而不是單個名字。此外,你將其中一個返回型別從string更改為map,以便可以返回映射到問候語的名字。 - 讓新的
Hellos函數呼叫現有的Hello函數。這有助於減少重複,同時保留兩個函數。 - 建立一個
messages映射,以關聯每個接收到的名字(作為鍵)與產生的訊息(作為值)。在 Go 中,你可以使用以下語法初始化映射:make(map[key-type]value-type)。你讓Hellos函數將此映射返回給呼叫者。有關映射的更多資訊,請參閱 Go 部落格上的 Go 映射實戰。 - 遍歷函數接收到的名字,檢查每個名字是否非空,然後為每個名字關聯一條訊息。在這個
for循環中,range返回兩個值:目前項在循環中的索引和該項值的副本。你不需要索引,因此使用 Go 空白識別符(底線)來忽略它。有關更多資訊,請參閱 Effective Go 中的 空白識別符。
- 更新你的
hello/hello.go檔案,以傳遞一個名字切片並列印你取得的名字/訊息映射的內容:
透過這些更改,你:
- 建立一個
names變數作為持有三個名字的切片型別。 - 將
names變數作為Hellos函數的參數傳遞。
- 從命令列執行程式碼 以驗證其是否正常運作:
輸出應該是要名字與訊息關聯的映射的字串表示,類似於以下內容:
總結
本主題介紹了用於表示名稱/值組的映射。它還介紹了透過為模組中新的或更改的功能實作新函數來保留向後相容性的思想。有關向後相容性的更多資訊,請參閱 保持模組相容。
接下來,你將使用 Go 的內建功能為你的程式碼建立單元測試。