青训营笔记1 - GO基础语法

76 阅读3分钟

青训营笔记1 - GO基础语法

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

前言

本人有一点语言基础,本笔记只记录一些本人认为相对重要和易忘易错易混淆的知识点,仅供分享参考,勿喷。

GO介绍

Go 是一门高性能,高并发,语法简单,学习曲线平缓的强类型和静态类型语言,其拥有丰富的标准库,完善的工具链,支持快速编译,跨平台且支持垃圾回收(GC) ;
由于本人学过一点Java,相较Java而比,Go是一个运行性能更佳的语言,国内外多家大厂开始用go来构造工具来优化性能,将来go也极可能成为主流语言,学习就是十分有必要的。

go基础语法相关知识点

IDE

Goland

变量

变量类型后置,可让语言自动推断。var x=1 int
go语言每句话没有分号分开

i := 1
复制代码

i快速声明初始化。

流程控制

基本和其他语言大差不差,但又有自己独特的特点,只要记住相关特点即可。
没有while只有for,可用for+bool来实现类似while的用法

切片

因为数组多是定长的,所以使用时多用切片来代替。切片(slice)某个数组或集合的一部分,切片是可变容量的,其工作原理类似于 Java 的 ArrayList,当切片容量不足时,便会自动扩容然后返回一个新的切片给我们。

s := make([]string, 3)
复制代码

声明一个切片S.
切片的 长度(length)  和 容量(capacity)  是两个完全不同的东西,前者才是切片实际的长度,后者则是一个阈值,当切片长度达到该阈值时才会对切片进行扩容。

当然,也可以直接指定一个切片的长度和容量:

s2 := make([]string, 0, 10)
复制代码

用append方法来添加(有点类似StringBuffer或StringBuilder),也可像数组一样访问s[i].
还有copy方法。 映射(Map)是一个无序 1 对 1 键值对。可以使用如下方式声明一个 Map:

m := make(map[string]int)
复制代码
复制代码

声明了一个键(key)为 string 类型,值(value)为 int 类型的 Map。

当然,也可以提前初始化 Map 内的值:

m2 := map[string]int{"one" : 1, "two" : 2}
复制代码
复制代码

可以使用类似于数组和切片的赋值语法为 Map 赋值,只不过,将索引换成了 key,目标值换为了 value

m["one"] = 1
m["two"] = 2
复制代码

这里感觉用起来相较Java更加便捷,有点类似python的用法。 Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

for key, value := range oldMap {
    newMap[key] = value
}
复制代码

以上代码中的 key 和 value 是可以省略。

如果只想读取 key,格式如下:

for key := range oldMap
复制代码

或者这样:

for key, _ := range oldMap

如果只想读取 value,格式如下:

for _, value := range oldMap
复制代码

Go 错误处理

如果返回的值错误对象为 nil,则代表没有发生错误,函数正常执行。 要实现此功能,需要导入 errors 包:

import (
    "errors"
)
复制代码
复制代码

声明函数:

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")
}
复制代码

其他

GO支持函数,指针,结构体,类似于C++和C。