go语言简介.md

Go 的优势

  • Go 的并发设计更优秀,并且规模上运行良好。
  • 统一了标准代码格式,可读性更强。
  • GC 明显比 Java 和 Python 更有效。

Go 的数据类型

基础有三种

  • 布尔
  • 数字
  • 字符串

派生类型

  • 指针
  • 函数
  • 结构体
  • 接口
  • 数组
  • 切片
  • Channel
  • Map

内建函数 new 函数

1
2
// new 函数定义
func new(t Type) *Type
  • 使用 new 分配内存,返回指针。
  • new 函数返回的指针指向的内存是未初始化,需手动初始化。

数组和切片

数组是固定长度的、同构(即元素类型相同)的数据结构,用于存储有序的数据集合。
切片是动态长度的、同构的轻量级数据结构,用于对底层数组的一个连续片段进行操作。切片本质上是对数组的一种抽象视图,由指向底层数组的指针、长度和容量构成。切片的长度和容量可以动态变化,提供了更为灵活的集合操作。

1
2
3
4
5
6
7
// 声明数组
var arr [5]int
arr := [5]int{1, 2, 3, 4, 5}

// 声明切片
slice := make([]int, 5)
slice := []int{1, 2, 3, 4, 5}
  • 数组固定长度,切片可以动态改变长度。
  • 数组是值类型,赋值或传参时会复制整个数组,切片是引用类型,赋值或传参时只复制指针、长度、容量。

Map

Map 是一种无序的键值对集合,用于存储键值对数据。底层实现是一个散列表,因此实现 Map 的过程实际上就是实现散表的过程。主要出现的结构体有两个,一个叫 hmap(a
header for a go map),一个叫 bmap(a bucket for a Go map,通常叫其
bucket)。

1
2
3
4
5
6
7
8
// 声明 map
m := make(map[string]int)
// 赋值
m["key"] = 1
// 获取
v := m["key"]
// 删除
delete(m, "key")

channel 概念和特性

channel 是通道,基础使用为

1
2
3
4
5
6
7
8
9
// 声明一个通道
var ch chan int
// 初始化一个通道
ch = make(chan int)
// 发送和接收
ch <- 1
<-ch
// 关闭通道
close(ch)

channel特性

  • 给 nil 的 channel 发送数据会永远阻塞。
  • 给 nil 的 channel 接收数据也会永远阻塞。
  • 已经关闭的 channel 发送数据会 panic 。
  • 已经关闭的通道进行接收会一直获取值直到通道缓冲区为空。
  • 已经关闭的 channel 接收数据,如果缓冲区为空,会返回零值。
  • 关闭已经关闭的 channel 会 panic 。

channel 的缓冲区
缓冲区为 0 的 channel 是无缓冲的。

1
2
3
4
// 声明一个缓冲区为 3 的 channel
ch := make(chan int, 3)
// 生命一个无缓冲的 channel
ch := make(chan int)
  • 无缓冲区的 channel 的发送和接收都是阻塞的,发送依赖接收。
  • 有缓冲区的 channel 的发送和接收都是非阻塞的,发送和接收是互不影响的。
  • 有缓冲区的 channel 已经满了,再发送会阻塞。

go语言简介.md
https://abrance.github.io/2024/09/20/mdstorage/project/short_media/架构师/go语言简介/
Author
xiaoy
Posted on
September 20, 2024
Licensed under