Go语言基础篇--10.Go语言之【type关键字+error】

本文深入探讨了Go语言中的类型定义与使用,包括类型别名与新类型的区别,以及如何将函数作为数据类型。同时,详细讲解了Go语言中的错误处理机制,包括错误与异常的概念区分,以及通过内置包创建和自定义错误的具体方法。

1.type关键字

1.1

type myint int
type myint2 = int

对于type myint int这句代码来说,其含义是重新定义一个新的类型为myint,在下述代码当中,如果讲a赋值给a1就会报错 c a n n o t   u s e   a ( t y p e   i n t ) a s   t y p e   m y i n t   i n   a s s i g n m e n t \color{red}{cannot use a (type int) as  type  myint  in  assignment} cannot use a(type int)as type myint in assignment ,这是因为两者是两个不同的数据类型无法赋值;
而对于type myint2 = int这行代码来说,相当于起一个类型别名的作用,仅仅是将int类型换一个名称myint2,本质上来说还是同一种数据类型,因此可以相互赋值。

1.2

go语言支持函数式编程,也就是说支持将函数作为一种数据类型,也可以把函数作为参数。在实际应用中,倘若函数的输入参数和返回参数较多较复杂,可以将其重新定义为一个新的名称。

type myfun func(int) string

func fun1() myfun {
	fun := func(a int) string {
		s := strconv.Itoa(a)
		return s
	}
	return fun
}
package main

import (
	"fmt"
	"strconv"
)

type myint int
type myint2 = int

type myfun func(int) string

func fun1() myfun {
	fun := func(a int) string {
		s := strconv.Itoa(a)
		return s
	}
	return fun
}

func main() {
	var a int = 100
	var a1 myint = 200
	var a2 myint2 = 300
	//a1 = a//cannot use a (type int) as type myint in assignment
	a2 = a
	fmt.Println(a, a1, a2)

	funfun := fun1()
	ss := funfun(22)
	fmt.Println(ss)
	fmt.Printf("%T\n", ss)
}
/*result
100 200 100
22
string
*/

其他需要注意的地方:
使用type时非本地类型不能定义方法
在结构体嵌入时使用别名
(目前还没有用到过,后续使用时再详解,有需要的可看视频)

2.error

错误与异常的区别:错误是在程序当中可能出问题的地方出现了问题,异常是在程序当中不该出现问题的地方出现了问题。错误是意料之中的,异常是始料未及的。
go语言当中可以把error也看做是一个数据类型。
go语言中可以通过两种方式来创建一个error类型
方式一:使用go语言中自带的errors包中的New来创建error

		err1 := errors.New("文件打开错误")
		fmt.Println(err1)

方式二:使用go语言中fmt包中的Errorf来创建error

		err2 := fmt.Errorf("文件打开错误")
		fmt.Println(err2)

示例代码:

package main

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

func main() {

	file, err := os.Open("./test1.txt")
	if err != nil {
		err1 := errors.New("文件打开错误")
		fmt.Println(err1)

		err2 := fmt.Errorf("文件打开错误")
		fmt.Println(err2)
		return
	}
	fmt.Println("文件打开", file.Name())

	checkAge(10)
	checkAge(-10)
}
//创建函数并自定义error
func checkAge(age int) error {
	if age < 0 {
		err := errors.New("年龄输入错误")
		fmt.Println(err)
		err = fmt.Errorf("您输入的年龄是%d,年龄输入错误\n", age)
		fmt.Println(err)
		return err
	}
	fmt.Println("您输入的年龄是:", age)
	return nil
}
/*result
文件打开 ./test1.txt
您输入的年龄是: 10
年龄输入错误
您输入的年龄是-10,年龄输入错误
*/

:go中对文件操作时,如果不使用绝对路径的话,这里要注意把文档放在包的同级目录下
在这里插入图片描述
error是接口类型,只能访问该接口对应的实现类型所实现的方法,如果想要获取到详细的错误信息,就要转到error该接口类型对应的实现类型上面去,这样就可以访问其实现类型的字段。

	/*error.go
	type PathError struct {
		Op   string
		Path string
		Err  error
	}

	func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
	*/
	file, err := os.Open("./test01.txt")
	if ins, ok := err.(*os.PathError); ok {
		fmt.Println(ins.Op)
		fmt.Println(ins.Err)
		fmt.Println(ins.Path)
	}
/*result
open
no such file or directory
./test01.txt
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值