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


被折叠的 条评论
为什么被折叠?



