go语言趣学指南自定义错误处理章的完整例子

前面几章看得轻松愉快,看到最后几章感觉脑子不太够用,学习进度指数级下降。白天总算是把错误处理章的最后一个例子完整打了一遍。

自定义错误

package main

import (
    "errors"
    "fmt"
    "os"
    "strings"
)

//类型与常量
const rows, columns = 9, 9

type SudokuError []error
type Grid [rows][columns]int8

//声明错误变量
var (
    ErrBounds = errors.New("out of bounds")
    ErrDigit  = errors.New("invalid digit")
)

//实现接口方法
func (se SudokuError) Error() string {
    var s []string
    for _, err := range se {
        s = append(s, err.Error())

    }
    return strings.Join(s, ", ")
}


func inBounds(row, column int) bool {
    if row < 0 || row >= rows {
        return false
    }
    if column < 0 || column >= columns {
        return false
    }
    return true
}

func validDigit(digit int8) bool {
    return digit >= 1 && digit <= 9
}

func (g *Grid) Set(row, column int, digit int8) error {
    var errs SudokuError
    if !inBounds(row, column) {
        errs = append(errs, ErrBounds)
    }
    if !validDigit(digit) {
        errs = append(errs, ErrDigit)
    }
    if len(errs) > 0 {
        return errs
    }
    g[row][column] = digit
    return nil
}

func main() {
    var g Grid
    err := g.Set(10, 0, 15)
    //类型断言
    if err != nil {
        if errs, ok := err.(SudokuError); ok {
            fmt.Printf("%d error(s) occurred:\n", len(errs))
            for _, e := range errs {
                fmt.Printf("- %v\n", e)
            }
        }
        os.Exit(1)
    }
}

类型断言

虽然想不出什么好词儿,但就是感觉断言这个词挺中二的。在 Go 里,接口变量可以存储任何实现了它的具体类型的值。但当你拿到一个接口变量时,编译器不知道它里面装的具体是什么类型。如果你想调用这个具体类型独有的方法或字段,就必须先通过类型断言把它“取出来”。

通俗点说,就是数据已经拿到了,但是类型是接口类型,不方便拆分调用,你原来该是什么类型,最好想办法还转为原来的数据类型。

标签: go语言

移动端可扫我直达哦~

推荐阅读

thumbnail 2026-08-08

go语言中的错误error与惊恐panic

学习go语言的时候遇到了两个类似的概念,错误与惊恐,好奇为什么不能统一一哈,于是查询了它们的区别:error:是可预见的问题,像走楼梯时不小心绊了一下,你能看到台阶,也知道可能会绊倒,处理一下就好。panic:是不可预见的严重故障,像...

少儿编程 go语言

thumbnail 2026-07-18

《go语言入门与精通》go语言中的命名规则

Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母( Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大写字母和小写字母是不同的: hea...

少儿编程 go语言

thumbnail 2026-06-04

go语言gin框架的学习笔记

上半年尝试制作了一个微信小程序,通过小程序请求后台服务器,服务器负责组装好用户需求的mp3文件,然后返回给用户播放地址,以实现一个简单的听写功能。其中后台的逻辑基本都是通过deepseek实现的,虽然成功跑通了,但是一直想从头手搓一遍...

少儿编程 go语言

thumbnail 2026-06-02

提升读写性能,go语言的bufio包

最近在尝试学习go语言,想去洛谷做几道题吧,结果前几个答案是正确的,最后两个报了超时,标准输入输出fmt存在读写性能上的缺陷。deepseek推荐了这个bufio包。bufio 包的核心功能bufio 提供缓冲 I/O,通过减少系统调...

少儿编程 go语言

thumbnail 2026-05-30

fmt,Go 语言自带的格式化输入输出包

fmt 可以理解为 Format(格式)的缩写——因为它擅长格式化数据(比如把数字嵌进句子中间)。fmt 就是 Go 语言的"终端对话工具",让你能在屏幕上显示东西,也能从键盘获取输入。fmt包的常用指令 概念对应 fmt 函数标准输...

少儿编程 go语言

thumbnail 2026-05-27

乱点技能树之-go语言笔记篇

系统仍旧是廉颇老矣的windows7,所以很多软件的新版本都没法运行,就像go已经出到了1.26版本,但win7上仅支持1.20.14,再往上就不受支持了,所以下方的代表仅在上述版本中验证通过。学习go语言的第一感受是,go语言取消了...

少儿编程 go语言