走进 Go 语言基础语言 | 青训营笔记

109 阅读4分钟

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

青训营课程笔记

准备工作

  • [Go语言编译器]([The Go Programming Language (google.cn)](https://golang.google.cn/))
    
  • [Go开发环境]:Goland(个人感觉Goland比VScode好用些,VScode要额外插件)([Goland 2022.3 x下载安装破解教程 | ide激活网 (idejihuo.com)](https://blog.idejihuo.com/jetbrains/goland-2022-3-crack-tutorial-effective-exclusive-activation-code-registration-code.html))
    
  • [课程用例代码Github]([wangkechun/go-by-example (github.com)](https://github.com/wangkechun/go-by-example))
    

1.Go语言

Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。

Go语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。

Go语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势,目前国内诸多 IT 公司均已采用Go语言开发项目。

Go语言有时候被描述为“C 类似语言”,或者是“21 世纪的C语言”。Go 从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。

因为Go语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说Go语言是一门混合型的语言。

1.1特点:

1.高性能高并发

2.语法简单易上手

3.丰富的标准库

4.完善的工具链

5.静态链接

6.快速编译

7.跨平台

8.垃圾回收

1.2

字节后端 Python ————> Golang

2、基础语法

2.1 Hello world

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

执行:go run XXX.go

2.2 变量

重点:变量声明

4种方式

无初始化声明
var a int

有初始化声明

var a int = 1

有初始化声明(自动获取varType,类似Python)

var a = 1

有初始化声明(简写)

a := 1//int
a := float32(1)//float32

常量

根据上下文自动确定类型

const str = "Hello World"

2.3 if else

重点:和C不同,条件没有括号。条件前面加一条执行语句

package main

import "fmt"

func main() {

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

   if 8%4 == 0 {
      fmt.Println("8 is divisible by 4")
   }

   if num := 9; num < 0 {
      fmt.Println(num, "is negative")
   } else if num < 10 {
      fmt.Println(num, "has 1 digit")
   } else {
      fmt.Println(num, "has multiple digits")
   }
}

2.4 循环

重点:没有括号,空为死循环,可以只有一个条件

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

2.5 switch分支结构

重点:结构类似c;每个case后自带break;可以使用任意变量类型(如字符串、结构体)甚至可以取代任何if-else语句

a := 2
switch a {
case 1:
   fmt.Println("one")
case 2:
   fmt.Println("two")
default:
   fmt.Println("other")
}

注:每个case自带break,比如上面代码执行了case 1 后会结束switch,而不是继续依次往下执行

t := time.Now()
switch {
case t.Hour() < 12:
   fmt.Println("It's before noon")
default:
   fmt.Println("It's after noon")
}

注:Golang的switch后面可以加任何变量,变量可以放在case后面,这样的结构比if-else结构更清晰直接(但是代码量好像提升了)

2.6 数组

重点:数组定长,用得比较少

var a [5]int
a[4] = 100
fmt.Println("get:", a[4])

2.7 切片

重点:常用切片取代数组,切片非常像Python的列表list

切片初始化

s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"

切片扩容

s = append(s, "d")

切片分片

fmt.Println(s[2:5]) // [c d e]

2.8 map

重点:声明比较形象;可以通过ok返回某个key值是否存在;map遍历是无序的

m := make(map[string]int)
m["one"] = 1
m["two"] = 2
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
delete(m, "one")
m2 := map[string]int{"one": 1, "two": 2}

2.9 range

重点:range可以遍历数组和map,返回两个值:下标(key)和值(value)

数组遍历

nums := []int{2, 3, 4}
for i, num := range nums {fmt.Println(i,num)}
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {fmt.Println(k,v)}

2.10 函数

重点:变量类型和返回类型都是后置的;通常业务逻辑中,最后会返回错误信息

fun 声明,变量类型和返回类型都是后置

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