GO语言基础语法|青训营笔记

93 阅读4分钟

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

1. 概述

我将主要介绍如下知识点:

  1. Go 语言开发环境配置

  2. Go 语言基础语法

  3. Go 语言标准库

2. 开发环境配置

2.1 安装 Golang

访问 go.dev/ ,点击 Download ,下载对应平台安装包,安装即可,我这里选择的是 windows 的压缩包,大家可根据自己的具体情况选择

图2.1.1

2.2 配置集成开发环境

可以选择安装 VS Code , 或者 Goland ,对于 VS Code,需要安装 Go 插件

我这里选择的是 Goland,也建议新手选择 Goland

3. 基础语法

3.1 入门案例—Hello World

代码:

package main

import "fmt"

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

package main 表示文件所在的包是 main

import “fmt” 表示引入一个包,包名fmt,引入该包以后就可以使用 fmt 包的函数

func 是一个关键字,表示一个函数

执行:

  • 可以使用 go build 命令
  • 还可以直接使用 go run 命令直接执行 go 源文件

图3.1.1

3.2 变量

go语言是一门强类型语言,每一个变量都有它自己的变量类型。常见的变量类型包括字符串、整型、浮点型、布尔型等。

声明变量:

var a int  // 创建类型为 int 的变量
var b, c float64 = 1.1, 2.1  // 同时声明多个变量
var d = "init"  // 若未指明变量类型但赋了值,Go语言会自动推断类型
e := true  // 也可直接用等号声明并赋值

3.3 选择语句

if else:if 后面没有括号,且 if 下方的语句必须用大括号包裹

switch:匹配项后面不需要再加 break

特别说明:GO 语言不支持三元运算符

代码:

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

// switch
a := 2
switch a {
case 1:
   fmt.Println("one")
case 2:
   fmt.Println("two")
case 3:
   fmt.Println("three")
case 4, 5:
   fmt.Println("four or five")
default:
   fmt.Println("other")
}

3.4 循环语句

在go里面没有 while 循环、do while 循环,只有唯一的一种 for 循环

// 死循环 + break
for {
   fmt.Println("loop")
   break
}

// for-range 方式
for n := 0; n < 5; n++ {
   if n%2 == 0 {
      continue
   }
   fmt.Println(n)
}

3.5 数组和切片

数组的定义: var 数组名 [数组大小]数据类型

var a [5]int
a[4] = 1  // 赋值

在真实业务代码里面,我们很少直接使用数组,因为它长度是固定的,我们用的更多的是切片(slice)

切片是引用类型,其长度是可以变化的,因此它是一个可以动态变化数组

切片的使用:

// 使用 make 创建切片
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2])  // c
fmt.Println("len:", len(s))  // 3

// 使用 append 对切片进行动态追加
s = append(s, "d")  // 注意必须把 append 的值赋值回原数组!
fmt.Println(s)  // [a b c d]
fmt.Println(s[2:])  // [c d]

// 使用 copy 拷贝切片
c := make([]string, len(s))
copy(c, s)
fmt.Println(c)  // [a b c d]

// 定义切片时也可直接指定具体的数组
good := []string{"g", "o", "o", "d"}
fmt.Println(good)  // [g o o d]

3.6 映射

map是key-value数据结构,类似其它编程语言的哈希或字典,是实际使用过程中最频繁用到的数据结构 ,map的 key-value是无序

map 的声明: m := make(map[keytype]valuetype)

map的使用:

m := make(map[string]int)  // make的作用就是给map分配数据空间

// map 的增改
m["one"] = 1
m["two"] = 2
fmt.Println(m)           // map[one:1 two:2]
fmt.Println(len(m))      // 2
fmt.Println(m["one"])    // 1
fmt.Println(m["unknow"]) // 0

// map 的查找
val, ok := m["unknow"]
fmt.Println(val, ok) // 0 false

// map 的删除
delete(m, "one")

// map 的遍历
for k, v := range m {
   fmt.Println(k, v)  // two 2
}

3.7 函数

Golang 和其他很多语言不一样的是,变量类型是后置的。其函数形参名在前,形参类型在后

如下示例 Golang 里面一个简单的实现两个变量相加的函数:

func add(a int, b int) int {
   return a + b
}

3.8 指针

go里面也支持指针。但是相比 C 和 C++ 里面的指针,支持的操作很有限

指针的一个主要用途就是对于传入参数进行修改,代码示例如下:

func addptr(n *int) {
   *n += 2
}

func main() {
   n := 5
   addptr(&n)
   fmt.Println(n) // 7
}

3.9 结构体

结构体是带类型的字段的集合

比如这里 user 结构包含了两个字段,name 和 password

type user struct {
   name     string
   password string
}

我们可以用结构体的名称去初始化一个结构体变量,构造的时候需要传入每个字段的初始值。也可以用键值对的方式去指定初始值,这样可以只对一部分字段进行初始化

同样,结构体也支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销

同时,在 Golang 里面可以为结构体定义一些方法,Golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是 struct

a := user{name: "wang", password: "1024"}
c := user{name: "wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024"

// 调用方法
fmt.Println(checkPassword2(&a, "haha")) // false

// 结构体方法
func checkPassword2(u *user, password string) bool {
   return u.password == password
}

3.10 错误处理

Go语言不支持传统的 try catch finally 这种处理异常处理机制

Go中引入的处理方式为: defer , panic , recover,即Go中可以抛出一个panic异常,然后在defer中通过recover捕获这个异常,然后正常处理

Go程序中,也支持自定义错误, 使用 errors.New 和 panic 内置函数

defer func() {
    err := recover()  // recover()内置函数,可以捕获到异常
    if err != nil {  // 说明捕获到错误
            fmt.Println("err=", err)
    }
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res=", res)  // err= runtime error: integer divide by zero

4. 标准库

4.1 字符串操作

在标准库 strings 包里面有很多常用的字符串工具函数。比如:

contains: 判断一个字符串里面是否有包含另一个字符串

count: 字符串计数

index: 查找某个字符串的位置

join: 连接多个字符串

repeat: 重复多个字符串

replace: 替换字符串

除此之外,在标准库的 fms 包里面有很多常用的字符串格式化 相关的方法,感兴趣的读者可自行查阅

4.2 时间处理

时间和日期相关函数,需要导入 time

在go语言里面最常用的就是 time.now() 来获取当前时间

也可以用 time.Format() 格式化日期时间

t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
fmt.Println(t) // 2022-03-27 01:25:36 +0000 UTC
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute())  // 2022 March 27 1 25
fmt.Println(t.Format("2006-01-02 15:04:05"))  // 2022-03-27 01:25:36

4.3 字符串类型转换

在 go 语言当中,关于字符串和数字类型之间的转换都在 strconv(string convert) 这个包下,我们可以用 ParseInt 或者 ParseFloat 来解析一个字符串

n, _ := strconv.ParseInt("111", 10, 64)
fmt.Println(n) // 111

4.4 获取进程信息

在 go 里面,我们能够用 os.Args 来得到程序执行的时候的指定的命令行参数

5. 总结

内容较多,需课后慢慢消化

参考: