go语言基础 | 青训营笔记

432 阅读5分钟

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

1.本节课程内容

主要有以下几个部分:

  1. Go 语言简介
  2. Go 语言开发入门,包括开发环境配置、基础语法、标准库
  3. Go 实战,包括三个实战项目

2.什么是go语言

go是一门高性能、高并发、语法简单、上手容易、学习曲线平缓的语言,具有丰富的标准库,完善的工具链,支持快速编译,能跨平台且支持垃圾回收(GC)。目前有很多公司如字节跳动、美团、滴滴、facebook等公司均在使用go语言。

3.go语言入门

1)go语言的开发环境

需要两步:1.安装golang;2.配置golang的编辑器或ide

1.安装golang

可以通过打开go.devstudygolang.com/dl下载安装包并安装golang。

2.安装ide

可以使用goland、vscode或者github上基于云的ide。 vscode是开源、免费的。goland是商用软件,可以免费试用30天,在goland官网进行学生认证可以免费使用一年的教育版。两者都可以在对应的软件官网进行下载,并按提示进行安装。vscode需要在安装golang扩展并安装gotools等工具。goland要配置的内容要少一些。

2)go语言的基础语法

个人感觉其基本语法在很多地方与c、java类似,同时又有着自己的风格。

1.从Hello World开始

package main

import (
   "fmt"
)

func main() {
   fmt.Println("hello world")
}

package语句表示程序的入口;import语句用来导入库,似乎类似于c中的#include 或者java中的import import ( "fmt" )语句表示导入标准库中的fmt包。将鼠标放在包名上,会弹出提示信息,点击后会打开网页,从而查看包的api。

2.go语言的变量类型、运算符等

go是一个强类型语言,每个变量都要指定类型。go中字符串是内置类型,可以直接通过‘+’号进行拼接。变量声明有两种方式:用var或者“变量名:= XXX”进行声明,如代码所示。用var形式声明时会自动匹配类型。

` var a = "initial"

cc := string("initial")`

常量的声明只需要将var改为const即可。注意的是,常量没有确定的类型,会根据使用的上下文自动确定。

const h = 500000000

大部分运算符的优先级与c类似

3.控制语句

1.if/else语句

其写法与c或者java的很类似,只是不用写小括号了,且要求大括号必须写,不能类似c中,有时候if语句中只有一行代码就将大括号省去。写法如下

if 7%2 == 0 {
   fmt.Println("7 is even")
} else {
   fmt.Println("7 is odd")
}

2.循环语句

go中没有while或者do while语句,循环语句只有for循环语句,写法上仍然是省去了小括号,且for语句的三段任何一段都能省去,如果都不写相当于是死循环,即类似while(true)的写法。也可以使用continue和break,且功能类似c。

for {
   fmt.Println("loop")
   break
}
for j := 7; j < 9; j++ {
   fmt.Println(j)
}

3.switch语句

整体与c写法类似,主要区别有三点:1.不写小括号2.支持的类型更多3.不需要类似c中每个分支都要加break,go中不写break,当前分支结束后,不会进行下一个分支。

4.数组、切片和map

数组

数组长度是固定的,其他的类似c。

切片(slice)

切片是可变长度的,需要用make语句创建,append添加。切片这里类似于python,但不支持负数索引。

map(哈希、字典)

map,也就是哈希表,在其它语言中都有类似的结构,其通过make创建,定义格式:

m := make(map[string]int)
m["one"] = 1

在上述语句创建的map,key的类型是string,value的类型是int。 go中map是完全无序的(不知道如果需要有序可以用什么数据结构)

r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false

通过加上ok来判断key值是否存在。

5.函数

golang中函数看起来与c等语言的类似,区别在于:1.变量类型后置2.原生支持返回多个值,第一个值是函数真正的返回值,第二个值是错误信息。

func exists(m map[string]string, k string) (v string, ok bool) {
   v, ok = m[k]
   return v, ok
}

6.指针

对比c等语言,指针能进行的操作有限。主要用途是通过函数对传入的参数进行修改(学c的时候经常提到的东西了23333)

7.结构体

声明格式:

type user struct {
   name     string
   password string
}

访问: 通过x.xxx的形式进行访问,如:

var d user
d.name = "wang"

结构体也可以作为函数的参数,同样可以通过指针传入。

8.错误

golang不像java通过异常处理(try-catch-finally那一套)。golang的方式是通过函数返回nil值来体现具体是哪个函数出现了错误,并能通过简单的if-else语句处理错误。

9.标准库

go语言中有很多标准库,如进行字符串处理的strings库,需要通过以下的语句导入。

import (
   "strings"
)

进行时间相关处理的times库等。进行将字符串转成数字等操作的strconv库。

4.go语言简单实践

通过猜数字、在线词典、SOCKS5 代理这三个项目,让学习者进一步加深对golang基础语法、标准库的理解,毕竟只看基础语法比上手写学新的语言会学的比较慢。

5.总结

通过今天的课程主要学习了go的基础知识。个人感觉go的基本语法与c、java、python有很多类似的地方,但部分地方又有自己的特色。因本人对python的接触较少,对于切片的接触较少,感觉比较难理解。同时其与其他语言相似但却不同的写法,估计在刚开始使用的时候,会犯不少错误。