从零开始Go语言Ⅱ-入门P2 | 青训营笔记

75 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第2天

前言
接续入门P1,继续了解熟悉Go语言的基础内容。

Go语言入门

基础语法

函数

函数是很多语言所需要了解和掌握的,虽然在日常编码中有一些常用函数,但有一些神奇操作需要自行查找手册,相比于手写结构,内置的函数性能更佳。

func function_name([parameter list]) [return_types] {
   函数体
}

在使用函数前,需要了解其构成:

  • func:函数由func开始声明
  • function_name:函数名称,参数列表和返回值类型构成函数签名
  • parameter list:参数列表,与众多语言相似
  • return_types:返回类型(如无返回值可省略)
  • 函数体:函数定义的代码块

指针

在学习C的指针后,深感无力,但是Go中的指针显然更加友好。以下是声明格式:

var var_name *var-type
func main() {
    var a int = 20 //声明实际变量
    var p *int //声明指针变量
    p = &a //将指针指向实际变量地址
}

以上为指针的创建,对指针变量的定义和赋值,便可以访问指针变量指向地址的值。

fmt.Printf("%x\n", &a)  //输出为20818a220
fmt.Printf("%x\n", p) //输出为20818a220
fmt.Printf("%d\n", *p) //输出为20

如果指针被定义但没赋值,其值为nil,也就是常说的空指针。

结构体及方法

结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,其构成如下:

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}

结构体定义后,可以进行变量声明:

variable_name := structure_variable_type {value1, value2...valuen}
或
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

在创建结构体后,如果想访问成员,可以使用以下语句:

结构体.成员名"

结构体同样可以定义指针,其格式类似于指针变量:

var struct_pointer *Books

查看结构体变量地址可以使用&操作符,访问结构体成员可以使用.操作符

结构体方法

定义结构体

type user struct {
    name string
    password string
}

声明一个密码匹配检测方法

func (u user) checkPassword(password string) bool {
    return u.password == password
}

声明一个重置密码方法,使用指针可以在原结构体基础上进行值变换

func (u *user) restPassword(password string) {
    u.password = password
}

方法调用

func main() {
    a := user{name: "wang", password: "1024"}
    a.resetPassword("2048")
    fmt.Println(a.checkPassword("2048")) //true
}

错误处理

Go语言中的错误处理,可以调用errors包,或使用内置的错误接口,接口定义为:

type error interface {
    Error() string
}

并发

在Go语言中,可以通过go关键字开启goroutine,其格式如下:

go 函数名(参数列表)

同一个程序中的所有goroutine共享地址空间,所以多个goroutine执行结果并没有固定顺序:

func say(s string) {  
        for i := 0; i < 5; i++ {  
                time.Sleep(100 * time.Millisecond)  
                fmt.Println(s)  
        }  
}  
  
func main() {  
        go say("world")  
        say("hello")  
}

以上代码执行所输出的结果没有固定格式,hello和world会轮流输出,但没有次序。

参考

  • 字节课程-Go语言原理与实践
  • 菜鸟教程-Go语言
  • Wiki-Go社区