Golang学习笔记_20——error

Golang学习笔记_17------方法
Golang学习笔记_18------接口
Golang学习笔记_19------Stringer


文章目录

    • error
      • [1. 接口](#1. 接口)
      • [2. 创建](#2. 创建)
      • [3. 自定义错误](#3. 自定义错误)
      • [4. 处理错误](#4. 处理错误)
      • [5. 实现`Error`接口](#5. 实现Error接口)
    • 源码

error

在Go语言中,error 是一个内建的接口类型,用于表示和处理错误情况。它是Go语言错误处理机制的核心。下面将详细讲解Go语言中 error 的相关概念和用法。

1. 接口

error 接口非常简单,仅包含一个方法

go 复制代码
type error interface {
    Error() string
}

2. 创建

go 复制代码
import (
    "errors"
    "fmt"
)

func demo_1() {
    err := errors.New("something went wrong")
    if err != nil {
        fmt.Println("Error:", err)
    }
}

测试方法

go 复制代码
func Test_demo_1(t *testing.T) {
	demo_1()
}

输出结果

复制代码
=== RUN   Test_demo_1
Error: something went wrong
--- PASS: Test_demo_1 (0.00s)
PASS

3. 自定义错误

go 复制代码
type MyError struct {
	Code    int
	Message string
}

func (e *MyError) Error() string {
	return fmt.Sprintf("code:%d \nmessage:%s", e.Code, e.Message)
}

func demo_2() {
	err := &MyError{
		Code:    1,
		Message: "something went wrong",
	}
	fmt.Println(err)
}

测试方法

go 复制代码
func Test_demo_2(t *testing.T) {
	demo_2()
}

输出结果

复制代码
=== RUN   Test_demo_2
code:1 
message:something went wrong
--- PASS: Test_demo_2 (0.00s)
PASS

4. 处理错误

在自定义错误代码的基础上,实现错误处理

go 复制代码
func demo_3(err *MyError) {

	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("No error")
	}
}

测试方法

go 复制代码
func Test_demo_3(t *testing.T) {
	type args struct {
		err *MyError
	}
	tests := []struct {
		name string
		args args
	}{
		{
			name: "error",
			args: args{
				err: &MyError{
					Code:    1,
					Message: "something went wrong",
				},
			},
		},
		{
			name: "no error",
			args: args{
				err: nil,
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			demo_3(tt.args.err)
		})
	}
}

输出结果

复制代码
=== RUN   Test_demo_3
=== RUN   Test_demo_3/error
Error: code:1 
message:something went wrong
=== RUN   Test_demo_3/no_error
No error
--- PASS: Test_demo_3 (0.00s)
    --- PASS: Test_demo_3/error (0.00s)
    --- PASS: Test_demo_3/no_error (0.00s)
PASS

5. 实现Error接口

go 复制代码
// 定义一个表示文件错误的结构体
type FileError struct {
	FileName string
	ErrMsg   string
}

// 实现 error 接口的 Error() 方法
func (e *FileError) Error() string {
	return fmt.Sprintf("file error: %s - %s", e.FileName, e.ErrMsg)
}

func demo_4() {
	err := &FileError{
		FileName: "example.txt",
		ErrMsg:   "failed to open file",
	}

	fmt.Println(err)
}

测试方法

go 复制代码
func Test_demo_4(t *testing.T) {
	demo_4()
}

输出结果

复制代码
=== RUN   Test_demo_4
file error: example.txt - failed to open file
--- PASS: Test_demo_4 (0.00s)
PASS

源码

go 复制代码
// error_demo.go 文件
package error_demo

import (
	"errors"
	"fmt"
)

func demo_1() {
	err := errors.New("something went wrong")
	if err != nil {
		fmt.Println("Error:", err)
	}
}

type MyError struct {
	Code    int
	Message string
}

func (e *MyError) Error() string {
	return fmt.Sprintf("code:%d \nmessage:%s", e.Code, e.Message)
}

func demo_2() {
	err := &MyError{
		Code:    1,
		Message: "something went wrong",
	}
	fmt.Println(err)
}

func demo_3(err *MyError) {

	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("No error")
	}
}

// 定义一个表示文件错误的结构体
type FileError struct {
	FileName string
	ErrMsg   string
}

// 实现 error 接口的 Error() 方法
func (e *FileError) Error() string {
	return fmt.Sprintf("file error: %s - %s", e.FileName, e.ErrMsg)
}

func demo_4() {
	err := &FileError{
		FileName: "example.txt",
		ErrMsg:   "failed to open file",
	}

	fmt.Println(err)
}
go 复制代码
// error_demo_test.go 文件
package error_demo

import (
	"errors"
	"testing"
)

func Test_demo_1(t *testing.T) {
	demo_1()
}

func Test_demo_2(t *testing.T) {
	demo_2()
}

func Test_demo_3(t *testing.T) {
	type args struct {
		err *MyError
	}
	tests := []struct {
		name string
		args args
	}{
		{
			name: "error",
			args: args{
				err: &MyError{
					Code:    1,
					Message: "something went wrong",
				},
			},
		},
		{
			name: "no error",
			args: args{
				err: nil,
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			demo_3(tt.args.err)
		})
	}
}

func Test_demo_4(t *testing.T) {
	demo_4()
}
相关推荐
一只可爱的小猴子8 分钟前
2022李宏毅老师机器学习课程笔记
人工智能·笔记·机器学习
孞㐑¥18 分钟前
C++11介绍
开发语言·c++·经验分享·笔记
使一颗心免于哀伤1 小时前
《重构》笔记摘录 - 9.处理继承关系
笔记
再睡一夏就好1 小时前
Linux常见工具如yum、vim、gcc、gdb的基本使用,以及编译过程和动静态链接的区别
linux·服务器·c语言·c++·笔记
俺的图图呢?1 小时前
Django笔记——CSRF
笔记·django·csrf
我的golang之路果然有问题1 小时前
快速了解redis,个人笔记
数据库·经验分享·redis·笔记·学习·缓存·内存
无心水2 小时前
【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?
java·笔记·面试·vector·arraylist·linkedlist
卡皮巴拉爱吃小蛋糕2 小时前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql
清流君2 小时前
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
数据库·人工智能·笔记·mysql·ue5·数字孪生
唐僧洗头爱飘柔95272 小时前
(Go Gin)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
后端·golang·go·restful·gin·goweb开发