【Go言語入門④】ランダム処理を通して、配列・スライスを触れる

Go言語
目次

過去の記事

下記の内容を実施している前提となりますのでご了承ください

今回の内容は下記のチュートリアルの内容となります

配列に似たスライスを利用する

配列に似たスライスを利用していきます

今回は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名分の挨拶が表示されました

次の記事

続いてテストを実行してみましょう!

ぎゅう
WEBエンジニア
渋谷でWEBエンジニアとして働く。
LaravelとVue.jsをよく取り扱い、誰でも仕様が伝わるコードを書くことを得意とする。
先輩だろうがプルリクにコメントをして、リファクタしまくる仕様伝わるコード書くマン
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる