참조: https://go.dev/doc/tutorial/random-greeting
- 개요
이번에는 하나의 인삿말 대신 미리 정의된 몇 가지 인삿말중 랜덤으로 하나를 반환해본다.
- slice
여러개의 정보를 저장하기 위해서 Go 의 slice 를 사용해본다. slice 는 array 와 비슷한데 요소를 추가하거나 삭제 함에 따라 크기가 동적으로 변한다는점이 다르다. slice 는 Go 에서 매우 유용한 타입이니 숙지해보도록 하자.
3 개의 인삿말 형식을 갖고 있는 slice 를 추가하고 그중 하나를 random 하게 반환한다. greetings.go 코드를 아래와 같이 수정해보자.
package greetings
import (
"errors"
"fmt"
"math/rand"
"time"
)
// Hello returns a greeting for the named person.
func Hello(name string) (string, error) {
// If no name was given, return an error with a message.
if name == "" {
return name, errors.New("empty name")
}
// Create a message using a random format.
message := fmt.Sprintf(randomFormat(), name)
return message, nil
}
// init sets initial values for variables used in the function.
func init() {
rand.Seed(time.Now().UnixNano())
}
// randomFormat returns one of a set of greeting messages. The returned
// message is selected at random.
func randomFormat() string {
// A slice of message formats.
formats := []string{
"Hi, %v. Welcome!",
"Great to see you, %v!",
"Hail, %v! Well met!",
}
// Return a randomly selected message format by specifying
// a random index for the slice of formats.
return formats[rand.Intn(len(formats))]
}
이 코드의 의미는 아래와 같다.
- random 하게 인삿말을 반환하기 위해 randomFormat 함수를 작성하였다. 함수이름이 소문자로 시작하므로 자기 자신의 package 에서만 접근할 수 있다. (exported 되지 않았다.)
- randomFormat 에서 []string 과 같이 size 정보없이 formats slice 를 선언했다.
- slice 의 요소를 random 하게 선택하도록 math/rand pacakge 를 사용했다.
- 현재 시간으로 rand package seed 하도록 init 함수를 추가했다. Go 는 전역 변수가 초기화된 후에 프로그램 시작시 자동으로 init 함수들을 실행한다.
hello.go 파일에서 빈값 대신 유효한 이름을 호출하면 실행될때마다 random 하게 출력됨을 알 수 있다.
message, err := greetings.Hello("Gladys")
'Language > Go' 카테고리의 다른 글
Go - test (0) | 2021.11.28 |
---|---|
Go - multiple input 과 return (0) | 2021.11.28 |
Go - Return 과 handle an error (0) | 2021.11.28 |
Go - called module 과 caller module (0) | 2021.11.28 |
Go - hello world 와 external package (0) | 2021.11.28 |
댓글