본문 바로가기
Language/Go

Go - random 과 slice

by ocwokocw 2021. 11. 28.

참조: 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

댓글