目次
過去の記事
下記の内容を実施している前提となりますのでご了承ください
【Go言語入門①】macOSに環境構築して、Hello Worldを表示する
Go言語の環境構築方法をお伝えしていきます 【パッケージをダウンロード】 まずはGo言語の公式ドキュメントに移行し、パッケージをダウンロードします (Go言語のバージ…
【Go言語入門②】Go言語でモジュールを作成し、理解を深める
【前回の内容】 前回実施した内容を理解した前提なので、まずは下記をやってみてくださいね 【今回実施する内容】 このチュートリアルでは、2 つのモジュールを作成しま…
【Go言語入門③】シンプルなエラーハンドリング
【過去の記事】 このシリーズはGoの公式ドキュメントに記載されている、チュートリアルを参考にしています。 チュートリアルの過去の記事をすすめた前提となっておりま…
今回の内容は下記のチュートリアルの内容となります
配列に似たスライスを利用する
配列に似たスライスを利用していきます
Go Slices: usage and internals – The Go Programming Language
How to use Go slices, and how they work.
【Go】基本文法メモ④(配列・スライス) – Qiita
概要A Tour of Goの順番に沿ってGoの基本で個人的に学習したことをまとめています。今回は Arrays(配列) と slices(スライス) に焦点を当てて学習しました。Arrays…
今回はstring型の集約したスライスを作成していきます。
formats := []string{
"Hi, %v. Welcome!",
"Great to see you. %v!",
"Hail, %v! Well met",
}
ランダムな挨拶をする処理を実装
greetings.goを下記の内容に更新します
package greetings
import (
"errors"
"fmt"
"math/rand" // 追加
"time" // 追加
)
func Hello(name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
message := fmt.Sprintf(randomFormat(), name) // randomFormat()に変更
return message, nil
}
// 下記を追加
func init() {
rand.Seed(time.Now().UnixNano())
}
func randomFormat() string {
formats := []string{
"Hi, %v. Welcome!",
"Great to see you. %v!",
"Hail, %v! Well met",
}
return formats[rand.Intn(len(formats))] // ランダムに挨拶を取得
}
続いて、Hello.goも変更します
package main
import (
"fmt"
"log"
"example.com/greetings"
)
func main() {
log.SetPrefix("greetings: ")
log.SetFlags(0)
message, err := greetings.Hello("Gladys") // 出力させる名前を追加
if err != nil {
log.Fatal(err)
}
fmt.Println(message)
}
動作確認
$ go run .
Great to see you, Gladys!
$ go run .
Hi, Gladys. Welcome!
$ go run .
Hail, Gladys! Well met!
動作確認をしてみると、ランダムに挨拶のフォーマットが変わっているのがわかります
複数人に挨拶を返す
参考内容
モジュールのコードに加える最後の変更では、1 つの要求で複数の人のあいさつを取得するためのサポートを追加します。つまり、複数値の入力を処理してから、その入力の値を複数値の出力とペアにします。これを行うには、一連の名前を関数に渡して、それぞれの名前の挨拶を返す必要があります。
しかし、問題があります。Hello
関数のパラメーターを単一の名前から一連の名前に変更すると、関数のシグネチャが変更されます。example.com/greetings
モジュールを既に公開しており、ユーザーが を呼び出すコードを既に記述している場合Hello
、その変更によってプログラムが破損します。
この状況では、別の名前で新しい関数を作成することをお勧めします。新しい関数は複数のパラメーターを取ります。これにより、下位互換性のために古い関数が保持されます。
greetings.goを更新
package greetings
import (
"errors"
"fmt"
"math/rand"
"time"
)
func Hello(name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
message := fmt.Sprintf(randomFormat(), name)
return message, nil
}
func Hellos(names []string) (map[string]string, error) {
messages := make(map[string]string)
for _, name := range names {
message, err := Hello(name)
if err != nil {
return nil, err
}
messages[name] = message
}
return messages, nil
}
func init() {
rand.Seed(time.Now().UnixNano())
}
func randomFormat() string {
formats := []string{
"Hi, %v. Welcome!",
"Great to see you. %v!",
"Hail, %v! Well met",
}
return formats[rand.Intn(len(formats))]
}
hello.goを更新
続いてhello.goを更新します
package main
import (
"fmt"
"log"
"example.com/greetings"
)
func main() {
log.SetPrefix("greetings: ")
log.SetFlags(0)
names := []string{"Gladys", "Samantha", "Darrin"} // namesを定義
messages, err := greetings.Hellos(names) //Hellosに変更
if err != nil {
log.Fatal(err)
}
fmt.Println(messages) // messagesに変更
}
実行する
それでは実行してみましょう
$go run .
map[Darrin:Hail, Darrin! Well met Gladys:Hail, Gladys! Well met Samantha:Hail, Samantha! Well met]
無事に3名分の挨拶が表示されました
次の記事
続いてテストを実行してみましょう!
【Go言語入門⑤】テストの実行
【今回の内容】 単体テストに対する Go の組み込みサポートにより、実行中のテストが容易になります。具体的には、命名規則、Go のtestingパッケージ、およびgo testコ…
コメント