Go语言基础 | 青训营笔记

66 阅读2分钟

这是我参与「第三届青训营 - 后端场」笔记创作活动的第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类型的变量并输出错误信息。