这一节会使用到slice,也叫切片,相当于动态数组,大小会随着元素的增加和删除而改变。slice是Go里面非常有用的类型。

这个代码里会新增一个有三个字符串的slice,然后随机返回一个slice里面的字符串。slice详情请查看slice。

  1. 在 greetins/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))]
}

以上代码:

  • 添加randomFormat函数,随机返回一个slice里的格式化字符串(这个函数是由小写字母开头,代表只能在这个包里调用,其他包里无法调用)
  • randomFormat函数里声明了一个有3个字符串的slice,声明slice时不需要在括号里写大小,如:[]string,代表大小可以动态改变。
  • 使用 math/rand 包生成一个随机数,从slice里选择一个元素
  • 在init函数里设置rand的随机盐为当前时间戳,Go在开始运行时会先运行init函数,然后再初始化全局变量,详情请查看Go高级特性
  • 在Hello函数里调用randomFormat获取一个随机的格式化字符串,然后用这个字符串生成一个问候语
  • 返回生成的问候语,或者在name为空是返回一个error
  1. 修改 hello/hello.go代码如下:
package main

import (
    "fmt"
    "log"

    "example.com/greetings"
)

func main() {
    // Set properties of the predefined Logger, including
    // the log entry prefix and a flag to disable printing
    // the time, source file, and line number.
    log.SetPrefix("greetings: ")
    log.SetFlags(0)

    // Request a greeting message.
    message, err := greetings.Hello("Gladys")
    // If an error was returned, print it to the console and
    // exit the program.
    if err != nil {
        log.Fatal(err)
    }

    // If no error was returned, print the returned message
    // to the console.
    fmt.Println(message)
}
go run .