这是我参与「第三届青训营 - 后端场」笔记创作活动的第4篇笔记
1.指针
指针在Go中被拆分为两个概念:
- 类型指针,允许对这个指针类型的数据进行修改。传递数据使用指针,无须复制数据。其不能进行偏移与运算。
- 切片,由指向起始元素的原始指针、元素数量和容量组成。
那么指针的作用有哪些呢?
1.1指针的使用
我以一段代码有演示:
package main
import "fmt"
func main() {
// &取地址符
// *取值符
a := 1
b := 2
swap(a,b) // 值传递
fmt.Println(a,",",b) //输出1,2
swapPoint(&a,&b) //指针传递 使用&获取变量地址
fmt.Println(a,",",b) //输出2,1
}
func swap(a,b int) {
t:=a
a=b
b=t
}
func swapPoint(a,b *int) {
t := *a //获取a指针指向的变量 赋值给t
*a = *b //将b指针指向的变量的值 赋值给a指针指向的变量
*b = t //将t的值 赋值给b指针指向的变量
}
1.2空指针
当一个指针被定义后没有被分配任何变量时,它的值为nil。
nil指针也称为空指针,对空指针不能进行读取操作,会直接抛出空指针异常
2.结构体
在Go语言中,我们不存在“类”这种面向对象的概念。Go语言中通过结构体的内嵌再配合接口的操作,具有更高的扩展性与灵活性。
2.1.自定义结构体
type Name struct{
name1 nametype1
name2 nametype2
...
}
2.2.结构体定义实例
type Person struct {
name string
age int8
}
当然结构体中的内容很多,我一个小菜鸡就不在这里我就不一一列举啦!后期若有空会专门写一期笔记来总结。
3.错误处理
Go语言不支持try...catch...finally这种处理方式。为此Go语言引入了新的处理方式defer,panic,recover。
3.1错误处理实例
package main
import (
"errors"
"fmt"
)
type user struct {
name string
password string
}
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
func main() {
u, err := findUser([]user{{"wang", "1024"}}, "wang")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u.name) // wang
if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err) // not found
return
} else {
fmt.Println(u.name)
}
}
3.2自定义错误
Go程序中也支持自定义错误,使用errors.New和panic内置函数。
- errors.New("错误说明"),会返回一个error类型的值来表示一个错误。
- panic内置函数,接收一个inferface{}类型的值作为参数。可以接收error类型的变量并输出错误信息。