Go语言基础(2)| 青训营笔记

107 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 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语言基础的总结啦,如有不妥之处还望指点一番~