Skip to content

函数的使用及错误处理

函数的声明

go
package greetings

import "fmt"

func Hello(name string) string {
    // := 快捷声明变量的语法糖
    // var message string
    // message = fmt.Sprintf("Hi, %v. Welcome!", name)
	message := fmt.Sprintln("Hi, %v. Welcome", name)
	return message
}
mod
// cd
// go mod init example.com/greetings
module example.com/greetings

go 1.23.0

函数的调用

go
package main

import (
    "fmt"

    "example.com/greetings"
)

func main() {
    message := greetings.Hello("Lee")
    fmt.Println(message)
}
mod
// cd
// go mod init example.com/hello
// go mod edit -replace example.com/greetings=../greetings
// go mod tidy
module example.com/hello

go 1.23.0

replace example.com/greetings => ../greetings

require example.com/greetings v0.0.0-00010101000000-000000000000

错误处理, 异常捕获

引入 errors 包, 函数返回多值, 使用 if 判断 nil 作为占位符返回没用错误的情况

go
package greetings

import "fmt"
import (                                               
    "errors"
    "fmt"
)                                                      

func Hello(name string) string {                       
func Hello(name string) (string, error) {              
    if name == "" {                                    
        return "", errors.New("name is empty")         
    }                                                  

    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message                                     
    return message, nil
}
go
package main

import (
    "fmt"
    "log"

    "example.com/greetings"
)

func main() {
    log.SetPrefix("greetings: ")                       
    log.SetFlags(0)                                    

    message, err := greetings.Hello("")                
    if err != nil {                                    
        log.Fatal(err)                                 
    }                                                  

    fmt.Println(message)
}

随机函数的引用

go
import (
    "errors"
    "fmt"
    "math/rand"
)

func randomFormat() string {    
    formats := []string{    
        "Hi, %v. Welcome!", 
        "Great to see you, %v!",    
        "Hail, %v! Well met!",  
    }   
    return formats[rand.Intn(len(formats))]     
}   

randomFormat()    

for 的使用

go
package greetings

import (
    "errors"
    "fmt"
    "math/rand"
)

func Hello(name string) (string, error) {
    if name == "" {
        return "", errors.New("name is empty")
    }

    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 randomFormat() string {
    formats := []string{
        "Hi, %v. Welcome!",
        "Great to see you, %v!",
        "Hail, %v! Well met!",
    }

    return formats[rand.Intn(len(formats))]
}
go
package main

import (
    "fmt"
    "log"

    "example.com/greetings"
)

func main() {
    log.SetPrefix("greetings: ")
    log.SetFlags(0)

    // message, err := greetings.Hello("Lee")
    names := []string{"Gladys", "Samantha", "Darrin"}    
    message, err := greetings.Hellos(names)    

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(message)
}

test 测试

go
package greetings

import (
    "errors"
    "fmt"
)

func Hello(name string) (string, error) {
    if name == "" {
        return "", errors.New("name is empty")
    }

    message := fmt.Sprintf(randomFormat(), name) // test success
    // message := fmt.Sprintf(randomFormat()) // test error
    return message, nil
}
go
package greetings

import (
    "regexp"
    "testing"
)

func TestHello(t *testing.T) {
    name := "Gladys"
    want := regexp.MustCompile(`\b` + name + `\b`)
    msg, err := Hello("Gladys")

    if !want.MatchString(msg) || err != nil {
        t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
    }
}

func TestHelloEmpty(t *testing.T) {
    msg, err := Hello("")
    if msg != "" || err == nil {
        t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
    }
}
  • 命令行测试
    • cd /home/greetings/
    • go test

编译与安装

shell
cd /home/hello
go build  # 编译成可执行文件
go list -f '{{.Target}}'  # 查看 go 安装路径
go install  # 安装