Go 快速入门指南 - 实现系统错误接口

概述

标准库 error 数据类型本质上就是一个接口,原型如下:

package builtin

type error interface {
    Error() string
}

例子

实现 error 接口

package main

import (
    "fmt"
)

// 自定义错误结构体
type divideError struct {
    msg string
}

// 实现 error 接口
func (d *divideError) Error() string {
    return d.msg
}

func newDivideError() *divideError {
    return &divideError{
        msg: "divide by zero",
    }
}

// 自定义除法函数
func myDivide(dividend, divisor float64) (float64, error) {
    if divisor == 0 { // 除数不能为 0
        return 0, newDivideError() // 返回一个自定义错误
    }
    return dividend / divisor, nil
}

func main() {
    divide, err := myDivide(100, 0)
    if err != nil {
        fmt.Printf("Error: %s\n", err) // 输出错误信息
    } else {
        fmt.Printf("100 / 0 = %.2f\n", divide) // 代码执行不到这里
    }
}

// $ go run main.go
// 输出如下
/**
  Error: divide by zero
*/

联系我

0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • 项目中的dao层,我们用来查询数据库,获取想要数据。有时我们会需要查询数据给结构体赋值,并返回一个结构体指针,如下 // 结构体字段已与数据库对应 func GetCommunity(id int) ...

  • 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是...

  • 什么是传值(值传递) func main() { i:=10 ip:=&i fmt.Printf("原始指针的内存地址是:%p\n",&ip) modify(ip) fmt.Println(...

  • 一 Consul介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。 1. 注册中心Consul基本介绍 ...

  • 概述建议先阅读 goroutine 小节。Go 箴言: 不要通过共享内存来通信,而要通过通信来共享内存。goroutine 是 Go 程序并发执行的实体,channel (通道) 则是它们之间的连接,...

  • 常量关键字 const, 和其他编程语言中常量的语义一样,定义后无法修改。语法规则const 常量名称 [常量类型] = 常量值 # 例子 const Pi float = 3...

  • dongle 是一个轻量级、语义化、对开发者友好的 Golang 编码解码和加密解密库Dongle 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧github.com/gol...

  • Go 箴言 不要通过共享内存进行通信,通过通信共享内存 并发不是并行 管道用于协调;互斥量(锁)用于同步 接口越大,抽象就越弱 利用好零值 空接口 interface{} 没有任何类型约束 Gofm...

  • 协程介绍 什么是协程? 协程,又称微线程,英文为 Coroutine。 协程可以理解为用户态线程,是比线程更小的执行单元。为啥说它是一个执行单元?因为它自带 CPU 上下文。这样只要在合适的时机,我们...

  • Go语言是一种高效、快速、简洁的编程语言,近年来越来越受到开发者的欢迎。由于Go语言的快速发展,出现了很多的优秀框架来支持Go应用程序的开发。以下是一些目前比较流行的Go语言框架: 1. Gin:Gi...

  • 一 什么是ELK ELK是三个[开源软件]的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件,新增了一个Beats。 Elasticsearc...

  • 这篇文章比较硬核,爆肝5千字,把之前整理的知识点都串起来了。建议先收藏,慢慢看。 前言 上一篇文章 #【Go WEB进阶实战】开源的电商前后台API系统 很受大家欢迎,有好多小伙伴私信我问题:“gt...

  • 概述new() 函数为数据类型 T 分配一块内存,初始化为类型 T 的零值,返回类型为指向数据的指针,可以用于所有数据类型。make() 函数除了为数据类型 T 分配内存外,还可以指定长度和容量,返回...

  • wire是Go官方推出的一款类似于Spring依赖注入工具。有别于以往的依赖注入工具facebookgo/inject、uber-go/dig等,采用反射实现。wire采用通过代码描述对象之间的依赖关...

  • 前言在前面多篇 Go 系列文章中,我们了解到,Go 语言脱胎于 C 语言,这就意味着在某些更底层的细节中,我们可以使用 C 语言实现,然后通过 Go 来调用相关的 C 代码。其实这一特点,在 Java...

  • 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder = [3,9,20,...

  • 一 前言 在utils目录中新建一个swap.go文件 swap.go中主要存放一些可以使用到的一些公共函数 导包: import ( "account/domain/model...

  • 概述调用 os 包即可。例子创建文件package main import ( "fmt" "os" ) func main() { file, err := os.Cre...

  • 概述相较于主流编程语言,Go 中的 switch 语法更加灵活,它接受任意形式的表达式。语法规则switch 后面的表达式不需要括号case 语句块执行完会自动退出整个 switch 语句块,也就是不...

  • 打包资源使用file2byteslice包我们可以将图片和config.json文件打包进二进制程序中,之后编译生成一个二进制程序。然后拷贝这一个文件即可,不用再拷贝图片和其他配置文件了。golang...