Go语言入门-基础上手|青训营笔记

99 阅读4分钟

Go语言入门-基础上手|青训营笔记

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

0. go语言的特性

  • 高性能,高并发
  • 语法简单
  • 丰富的标准库
  • 完善的工具链
  • 静态链接:上线包可以做的很小
  • 快速编译:编译时间在数秒
  • 跨平台:跨平台,且支持交叉编译
  • 垃圾回收

1. 开发环境配置

官方网址:go.dev

国内镜像:studygolang.com/dl

配置代理,加速第三方库的下载(类似pip换源):goproxy.cn,网页内有配置指导

开发环境:首选VSCode,下载完成后在左侧栏内安装go语言相关插件

2. 第一个HelloWorld程序

2.1 从hello world看程序的构成要素

package:指定包,包名需要使用双引号

{}:语句块

import:导入标准库

func:定义函数

fmt:标准io库,可以通过编辑器的lsp功能查看可选函数,标准库中的函数通常以大写字母开头

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

2.2 编译运行

编译运行:go run <filename>.go

编译成为可执行文件之后运行:编译 go build <filename>.go 运行 pathtofile/<filename>

3. 变量和常量

3.1 变量类型

go语言是强类型语言,每个变量都有其对应的类型

常见的数据类型有:字符串,整形,浮点型,布尔型

字符串是go语言中的 “一类公民“ ,可以直接作为参数和返回值,使用加号拼接

变量声明

声明的三种可能要素:声明,初始化,赋值

  • 声明:显示类型var 变量名 变量类型
  • 赋值:变量隐式声明 变量名 := 已有变量/字面量 -> 这一种最简洁,在循环等结构中常用

  • 声明+初始化:

    • 显式类型:var 变量名 变量类型 = 字面量 -> 这一种最容易读懂,有利于代码规范
    • 隐式类型:var 变量名 = 常量

注意区别变量初始化 = 与变量赋值 :=

3.2 常量

常量使用关键字const来声明(用法约等于上面的var)

常量没有指定的类型,在编译时根据程序上下文确定

4. 程序控制流

4.1 if else

if 条件 {} else {}:注意条件不需要使用括号包裹 ,不过编译器会自动去除多余括号

语句块必须要分行书写,不能写在同一行

4.2 for/while 循环

在go语言中,for/while循环都使用for关键字实现,

for 循环分句 {}:循环分句可以使用c语言中for循环或者while循环的格式从而实现不同的循环,同样注意循环分句不需要使用括号包裹

什么都不写代表死循环

continue:进入下一轮循环

break:跳出循环

4.3 switch 语句

switch 变量 {case 字面量: 语句 ...}

注意与c语言中的区别,默认只会完成一个case,不需要break语句

go语言中强大的switch语句:判断的变量可以使用字符串,结构体,也可以什么都不加,在case当中书写条件,从而优雅完成分支较多的判断流

5. 数组与切片

数组长度固定而切片长度可变,实际场景中更常使用切片

一个疑问,似乎数组和切片通常通过隐式的方法进行声明,也许是其声明语句本身已经有较强的可读性,还是说数组和切片并不属于基础类型?

5.1 数组定义

数组声明:var 数组名[数组长度]变量类型

列表初始化:数组名 := [数组长度]变量类型{初始化列表}

二维数组定义:var 数组名 [m][n]变量类型

5.2 切片定义

切片声明:切片名 := make([]变类型, 初始长度)

列表初始化:s := []变量类型{初始化列表}

dst=append(dst, src):如果不扩容返回dst地址,如果扩容返回扩容后地址

copy(dst, src):这里src和dst需要长度相等吗?

s[si:di]:注意索引不可以用负数,左开右闭

6. map

map声明:m := make(map[key]val)

列表初始化:m := [key]val{key:val列表}

r, ok := m[key]:有两个返回值,后一个表示key是否存在

赋值的特点,左右两侧可以有不对等的变量数量和值,多余的值会被忽略,如果变量多余呢?

delete(m, key)

7. range