go语言基础 | 青训营笔记

74 阅读3分钟

go语言基础 | 青训营笔记

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

参考资料以及上手流程

image.png

go语言的特点

  1. 高性能、原生支持高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链:C++需要.so才可以运行,java需要附加jre才可以运行,而go语言利用其完整的工具链进行链接的工作。
  5. 静态链接
  6. 快速编译
  7. 跨平台:这里我感触比较深的就是交叉编译,可以在Windows环境当中编译Linux的项目,按照下面的命令行代码就可以完成编译的过程
SET CGO_ENABLE=1
SET GOOS=windows
SET GOARCH=amd64

go build main.go
  1. 垃圾回收

配置开发环境

  1. 安装go环境
  2. 安装goland或者使用vscode (这里我选择安装的是goland)

这里其实有可以参考的安装资料: (267条消息) goland环境配置_阿拉的梦想的博客-CSDN博客_goland环境配置

go语言基础语法

go语言的输入输出以及格式化工作

fmt包当中可以使用类似Printf,或者Println这样的函数,当然其实不使用fmt包的话,也可以做一些输入输出,但是官方文档中给出,他们不保证之后的go版本仍然会支持这样的原生的输入输出函数。

fmt包做的工作也不止是简单的输入输出,fmt包当中也会做一些格式化的工作,这样对于我们一直以来痛苦的格式问题,也迎刃而解。

go语言的变量类型

  • 数值类型
    • 整型
    • 浮点型
  • 字符串类型

这里需要注意的是,go语言当中的常量是没有确定的类型的,是会根据上下文推导出其类型的。

//变量的定义
a := 111
var a int64

go语言的基础语法

选择/分支语句

// 下面写一个最简单的程序
package main

import "fmt"

func main() {
	var a int64
	_, err := fmt.Scan(&a)
	if err != nil {
		return
	}
	if a > 10 {
		fmt.Println("a is bigger than 10!")
	} else {
		fmt.Println("else")
	}
}

当然在go语言当中if语句有一种给更加特殊的用法,我们这里尝试一下

package main

import "fmt"

func main() {
	var a int64
	_, err := fmt.Scan(&a)
	if err != nil {
		return
	}
	if b := a; b > 10 { // 可以看到这里我们先执行了一个语句然后再加入了条件,让if语句也有像
		fmt.Println("a is bigger than 10!")
	} else {
		fmt.Println("else")
	}
}

switch语句,主要是我们不需要使用break来控制,虽然少了一些灵活性,但是适用大部分的情况,同时case后可以使用任意的类型 image.png

循环

go语言当中是没有while关键字的,利用for循环就可以解决所有的循环需求

// 下面写一个最简单的测试程序
package main

import "fmt"

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

	for j := 7; j < 9; j++ {
		fmt.Println(j)
	}

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

	for i <= 3 {
		fmt.Println(i)
		i++
	}
}

数组

真实的业务场景当中很少使用数组,我们更多的使用的是切。

image.png

切片

image.png

关于切片的本质

切片类似于C++当中的vector,动态数组 每个切片对象内部都维护着数组指针、切片长度、切片容量三个数据。

所以我们可以认为,切片的结构可以由下面的代码构成:

type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}

而go语言当中只有值传递,那么当我们将slice作为参数传递的时候,其中的Pointer会发生拷贝,也就是修改的还是原本的切片

map

map类型,本质是哈希表,类似于字典。

image.png

map类型的本质

底层基于哈希表存储原理

map的特点

  • 键不能重复
  • 键必须可哈希(int/bool/float/string/array)
  • 无序

函数

golang的函数可以同时返回多个值,也更加灵活,我们可以利用这个特点,返回一个err,用于处理我们的错误。 image.png

range

image.png

指针

image.png

结构体

image.png