Go语言入门指南:基础语法和常用特性解析|青训营

56 阅读5分钟

(一)Go语言是什么

1.Google出品的计算机通用语言

2.特点:

(1)高性能,高并发:不需要寻找高度优化的第三方库进行开发应用,只需要使用标准库或者基于标准库的第三方库即可开发高并发应用程序。

(2)语法简单、学习曲线平缓。

(3)丰富的标准库。

(4)完善的工具链

(5)静态链接:只需要拷贝编译之后的唯一一个可执行文件,不需要附加任何东西就能部署运行。

(6)快速编译。

(7)跨平台。

(8)垃圾回收。

3.哪些公司在使用Go语言

image.png

  1. 字节跳动为什么全面拥抱Go语言

(1)最初使用的 Python,由于性能问题换成了Go

(2)C++ 不太适合在线 Web业务

(3)早期团队非Java背景

(4)性能比较好

(5)部署简单、学习成本低

(6)内部 RPC和 HTTP框架的推广

(一)入门

1.开发环境

(1)安装Golang

go.dev/

studygolang.com/dl

goproxy.cn/

(2)开发环境:VScode、Golang或者使用GitHub在线编程环境

(3)创建项目(使用Golang)

image.png

image.png pkg:放置自定义包的位置
bin:用来存放编译后的 .exe 文件
src:我们的工程的开发文件存放的点,在 src 中创建 项目跟项目文件

(4)创建文件

image.png

(5)修改运行时的配置信息

image.png

image.png

image.png

image.png Run Kind :选择 Directory

Package_path:指定项目目录

Output_directory :指定 编译完成后的文件输出路径

WOrking Directory :指定工作空间的路径

(6)Hello world

image.png

2.基础语法

(1)语言变量

① 变量说明:

使用var关键字:

var  identifier  type

一次声明多个变量:

Var  identifier1 ,  identifier2  type

② 声明变量的三种方式

1)指定变量类型,如果没有初始化,则变量默认为零值。

2)根据值自行判定变量类型。

3):=

intVal := 1 相等于:

var intVal int

intVal =1

image.png

(2)语言常量

① 定义格式:

Const  identifier  [type]  =  value

2.条件语句

If...else: 与C++类似,区别在于if后面没有括号;if后必须跟“{”。

Swich: switch 从第一个判断表达式为 true 的 case 开始执行:如果 case 带有 fallthrough,程序会继续执行下一条 case,且它不会去判断下一个 case 的表达式是否为 true;如果没有带fallthrough,执行完该case直接跳出swich语句继续执行后面的语句。Go中的swich可以代替if语句,效率更高。

3.循环语句

在go中只有for循环。

4.数组

(1)Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:

var  arrayName  [size]dataType

数组的名称 [数组的大小]数组中元素的数据类型

Var  numbers  =  [5]int{1, 2, 3, 4, 5},相当于:

Numbers  :=  [5]int{1, 2, 3, 4, 5}

Numbers  :=  [...]int{1, 2, 3, 4, 5}(自行推断数组长度)

Numbers  :=  [5]int{1:1, 3:3}(指定下标初始化元素)

5.切片

(1)声明

① 用未知长度的数组:

Var  identifier  []type

② 使用make函数:
var  slice1  []type  =  make( []type ,  len )

也可以简写为

slice1  :=  make ( []type ,  len )

(2)实例

`package main

import "fmt"

func main() {

   /* 创建切片 */

   numbers := []int{0,1,2,3,4,5,6,7,8}  

   printSlice(numbers)  

   /* 打印原始切片 */

   fmt.Println("numbers ==", numbers)  

   /* 打印子切片从索引1(包含) 到索引4(不包含)*/

   fmt.Println("numbers[1:4] ==", numbers[1:4])  

   /* 默认下限为 0*/

   fmt.Println("numbers[:3] ==", numbers[:3])  

   /* 默认上限为 len(s)*/

   fmt.Println("numbers[4:] ==", numbers[4:])

   numbers1 := make([]int,0,5)

   printSlice(numbers1)

   /* 打印子切片从索引  0(包含) 到索引 2(不包含) */

   number2 := numbers[:2]

   printSlice(number2)

   /* 打印子切片从索引 2(包含) 到索引 5(不包含) */

   number3 := numbers[2:5]

   printSlice(number3)

}

func printSlice(x []int){

   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)

}`

结果:

len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]

numbers == [0 1 2 3 4 5 6 7 8]

numbers[1:4] == [1 2 3]

numbers[:3] == [0 1 2]

numbers[4:] == [4 5 6 7 8]

len=0 cap=5 slice=[]

len=2 cap=9 slice=[0 1]

len=3 cap=7 slice=[2 3 4]

(3)Append()和copy()函数,类似于python中的用法:

/* 同时添加多个元素 */    numbers1 = append(numbers1, 9,10,11)

输出结果为:

len=3 cap=5 slice=[9 10 11]

/* 拷贝 numbers2 的内容到 numbers1 */    copy(numbers1,numbers2)    printSlice(numbers1)  

输出结果为:

len=3 cap=5 slice=[0 1 11]

(4)Map

① 定义

Map 是一种无序的键值对的集合。

`/* 使用 make 函数 */

map_variable  :=  make ( map[KeyType]ValueType ,  initialCapacity )

// 创建一个空的 Map

m := make(map[string]int)

// 创建一个初始容量为 10 的 Map

m := make(map[string]int, 10)

// 使用字面量创建 Map

m := map[string]int{

    "apple": 1,

    "banana": 2,

"orange": 3,}

// 遍历 Map

for k, v := range m {

    fmt.Printf("key=%s, value=%d\n", k, v)

}`

(三)单元测试

规范的测试命名能够更方便和简单高效的进行测试。

利用assert包

(1)如何衡量代码是否经过了足够的测试?

(2)如何评价项目的测试水准?

(3)如何评估项目是否达到了高水准测试等级?

代码的覆盖率越高代码的正确性越高。

(1)一般的主流代码覆盖率为50%-60%,资金交易需达到80%以上

(2)测试分支相互独立有利于全面覆盖。

(3)测试单元粒度足够小,函数单一职责,有利于提高覆盖率。

1.Mock测试:不依赖本地文件,可以在任何时间任何环境执行

快速mock函数:为一个函数打桩

打桩:一个函数替换另一个函数

A函数替换B函数:A:打桩函数;B:打桩函数

Patch打桩函数,unpatch卸载桩函数

2.基准测试:分析性能

优化代码

Goland内置的测试框架提供了基准测试的能力

总结:笔记+实践,不完整