GoLang基础入门及语法 | 青训营笔记

99 阅读6分钟

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

从今天开始进行青训营go语言的系统学习,笔记中有视频课的相关知识点,也有我自己个人的一些心得和体会和大家一起分享。

要学习,先找总路线。

go语言学习路线图

本节课学习路线 image.png

1.Go的简介

什么是 Go

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

Go 的特点

image.png

image.png

Go 的应用场景

字节、谷歌、Facebook、腾讯、七牛云、哔哩哔哩等公司都在使用

在云计算、微服务、大数据等领域都有很大的发展空间

2.Vscode上配置Go环境

这里因为我用的Windows系统,所以按照这个去配置(其它系统其实大同小异)

安装 Go 语言

  1. 访问 go.dev/ ,点击 Download ,下载对应平台安装包,安装即可
  2. 如果无法访问上述网址,可以改为访问 studygolang.com/dl 下载安装
  3. 如果访问 github 速度比较慢,建议配置 go mod proxy,参考 goproxy.cn/ 里面的描述配置,下载第三方依赖包的速度可以大大加快

(这里的环境变量一定要记得更改!) image.png 改完之后记得在终端输入go env查一下这两个改好了没

image.png

配置 Go 环境

这里Vscode的安装不赘述,网上都有教程。

在Vscode扩展商店里记得安装Go插件

image.png

然后就可以把老师给的github上的案例clone到本地了(或者你也可以手打熟悉熟悉)

这里克隆到本地用Git Bash就可以也比较容易给大家一篇文章参考 (如何克隆GitHub上的项目到本地_打白i的博客-CSDN博客_克隆git hub的项目)

案例克隆到本地后用Vscode打开之后就是这样

image.png

Vscode右下角会提示你下一些东西(这里建议直接install all就行,下的有些慢等一会就好了)

下好之后就可以运行演示了 (两种方式)

1.新建一个终端输入 go run example/01-hello/main.go

2.直接插件商店里下一个code runner点右上角三角符号也能运行(我自己用的这个)

运行结果如下:

image.png

输出hello world就说明Vscode下Go环境配置成功了!

3.Go语法基础

一个“Hello World”的基本结构

package main //当前包

import (
	"fmt"  //外部依赖包
)

//主函数
func main() {
	fmt.Println("hello world") //输出
}

变量与常量

Go语言是一门静态强类型语言,常见的变量类型包括整型,字符串,浮点型,布尔类型等。其声明方式主要有两种:

var声明语句可以创建一个特定类型的变量,然后给变量附加一个名字,并且设置变量的初始值。变量声明一般几种语法如下:

  1. var 变量名 类型 = 值(显示声明)
  2. var 变量名 = 值(根据赋值自动确定类型)
  3. 变量名 : = 值(省略var,不可用于声明全局变量)
var a = "initial"

var b, c int = 1, 2

var d = true

var e float64

f := float32(e)

g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g)                // initialapple

用const定义常量,可使用constiota方便地定义枚举:

const ca int = 1
// iota 初始为0,逐行递增
const (
    a, b = iota, iota+1            // 0, 1 
    c, d                           // 1, 2
    e, f = iota * 10, iota * 20    // 20, 40
    g, h                           // 30, 60
)

if-else语句和循环语句

Go 的if-else语句与c++的类似,区别是没有括号

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")
}

Go 的循环语句只有for,没有whiledo while

几种不同的用法


	//死循环
	i := 1
	for {
		fmt.Println("loop")
		break
	}

	//类似c++的for循环
	for j := 7; j < 9; j++ {
		fmt.Println(j)
	}

	//也可使用c++中的continue和break
	for n := 0; n < 5; n++ {
		if n%2 == 0 {
			continue
		}
		fmt.Println(n)
	}

	//不同的写法,将起始条件前置,将循环条件后置
	for i <= 3 {
		fmt.Println(i)
		i = i + 1
	}

switch分支语句

Go 的switch case可以使用任意的变量类型,也可以省略 switch 后的变量,每个 case 作为一个独立的分支判断(但只执行第一个符合条件的)

	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")
	}
        

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

数组与切片

数组基本用法

//一维数组
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))

b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)

//二维数组
var twoD [2][3]int
for i := 0; i < 2; i++ {
	for j := 0; j < 3; j++ {
		twoD[i][j] = i + j
	}
}
fmt.Println("2d: ", twoD)

切片不同于数组,可任意改变长度,可以理解为"动态数组"

数组名 := make([]string, 数组长度)

copy(数组1,数组2) 这样数组1就会直接复制数组2的元素

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")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]

c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]

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

good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]

map和range

1. map 中的数据不会自动排列,其顺序是随机的

2. 也可以使用 range 来遍历 map(使代码更简洁)

map语法格式 map名 := make(map[key的类型]值的类型)

在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。

m := make(map[string]int)
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

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

//删除后为map[two:2]
delete(m, "one")
fmt.Println(m)

range起到遍历作用

m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
	fmt.Println(k, v) // b 8; a A
}
for k := range m {
	fmt.Println("key", k) // key a; key b
}

小结

第一天的学习工作量还是很大,这里先做个小结。这节主要是进行了对Go语言的了解和Go环境的配置,也进行了Go语言基础语法的部分学习。个人感觉Go语言现在的应用范围广,很有前景,因为有过C和Java的学习基础,在Go语言的学习上,能找到一些共同之处,但Go在语法的一些使用上也有其自身的特点,还需不断学习和熟练。加油!