这是我参与「第三届青训营 -后端场」笔记创作活动的的第 3 篇笔记
本文为个人创作将会在本人掘金以及CSDN等平台发布
在青训营第一节课中,我开始了Go语言的初步学习,在讲师的讲解下,我对于Go语言基础有了许多初步的了解,接下来我将接着上一次笔记继续完成第3次笔记,记录下我在其中的收获!
1.指针
对于指针这个概念,相信我们并不陌生吧,在C语言中,指针会让许多人感到一定畏惧。
相比于C/C++,Go语言中直接摒弃了最复杂的指针运算部分,只保留了获取指针(&运算符)和获取对象(* 运算符)的运算。
Go语言的指针用法虽然与C语言有很多类似的地方,但其与c语言的指针仍然有不同之处,下面我列出3点:
- Go语言中指针没有->操作符来调用指针所属的成员,而与一般对象一样,都是使用.来调用
- Go语言中一个指针被定义后没有被分配变量时,它的值为nil
- Go语言中对于一些复杂类型的指针,若要访问成员变量时* p.field的形式可直接写为p.field即可访问相应成员,这归功于Go语言自带的指针隐式解引用。
指针在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指针也称为空指针,对空指针不能进行读取操作,会直接抛出空指针异常
做一个简单的总结吧:
- 指针是一个特殊的变量,它里面存储的是另一个变量的内存地址,&操作符获取变量地址,* 操作符获取指针指向的变量的值
- 只声明未赋值的指针,默认值为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。
错误处理实例
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)
}
}
自定义错误
Go程序中也支持自定义错误,使用errors.New和panic内置函数。
- errors.New("错误说明"),会返回一个error类型的值来表示一个错误。
- panic内置函数,接收一个inferface{}类型的值作为参数。可以接收error类型的变量并输出错误信息。
4.接口
接口是我们每一门高级编程语言中都有的概念,在Go中,接口是一组方法的集合,但其不包含方法实现也不能包含变量。
下面就让我介绍一下相关接口的内容吧。
接口的声明
接口的声明类似于结构体,语法下:
type Name inferface{
method1(param_lise) return_type
method2(param_lise) return_type
...
}
接口的实现示例
type Person interface {
speak()
read()
}
实现接口的两种方式
- 值接受
- 指针接受
空接口
在Go中,空接口是指没有任何方法的接口。
实际上每个类型都实现了空接口,即空接口类型可以接受任何类型的数据.
以下就是我在青训营中学习的一些Go语言基础的总结啦,如有不妥之处还望指点一番~