顾名思义,unsafe 是不安全的。Go 将其定义为这个包名,也是为了让我们尽可能地不使用它。不过虽然不安全,它也有优势,那就是可以绕过 Go 的内存安全机制,直接对内存进行读写。所以有时候出于性能需要,还是会冒险使用它来对内存进行操作。

阅读全文 »

在web应用调用 API 的时候,需要把 API 返回的 JSON 字符串转换为 struct 结构体,便于操作。那么一个 JSON 字符串是如何转换为 struct 结构体的呢?这就需要用到反射的知识,今天学习基于字符串和结构体之间的转换,一步步地揭开 Go 语言运行时反射的面纱。

阅读全文 »

程序的运行都需要内存,比如像变量的创建、函数的调用、数据的计算等。所以在需要内存的时候就要申请内存,进行内存分配。在 C/C++ 这类语言中,内存是由开发者自己管理的,需要主动申请和释放,而在 Go 语言中则是由该语言自己管理的,开发者不用做太多干涉,只需要声明变量,Go 语言就会根据变量的类型自动分配相应的内存。

阅读全文 »

前言

先看一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type address struct {
province string
city string
}

func (addr address) String() string {
return fmt.Sprintf("the addr is %s%s", addr.province, addr.city)
}
func main() {
add := address{province: "山东省", city: "济南市"}
printString(add)
printString(&add)
}
func printString(s fmt.Stringer) {
fmt.Println(s.String())
}

运行结果:
the addr is 山东省济南市
the addr is 山东省济南市

阅读全文 »

什么是指针

程序运行时的数据是存放在内存中的,而内存会被抽象为一系列具有连续编号的存储空间,那么每一个存储在内存中的数据都会有一个编号,这个编号就是内存地址。有了这个内存地址就可以找到这个内存中存储的数据,而内存地址可以被赋值给一个指针。

阅读全文 »

如何用 goroutine、channel、sync包 这些基础元素组成并发模式,更好地编写并发程序。

阅读全文 »

前言

之前学习了怎么在所有的协程运行结束后让程序停止。这次学一下怎么让运行中的协程停止。比如我们开了1个协程去监控一个程序,如果我们手动取消监控就要让协程主动停止任务,该怎么实现呢?用 select+channel 做检测!

阅读全文 »

sync.Mutex

如果同一块内存被多个 goroutine 同时访问,就会产生不知道谁先访问也无法预料最后结果的情况。这就是资源竞争,这块内存可以称为共享的资源。例如下面的代码

阅读全文 »

声明channel

channel是go语言中的一种数据类型,也叫通道
声明方式

1
ch:=make(chan string)
  • ch : channel的变量名
  • chan : 声明channel的关键字
  • string : channel中存储额数据类型
    阅读全文 »