抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

前言

最近遇到了一个需求:后台根据存储数据生成一个PDF报表,里面还会有各种分析图表,经过技术调研后,大体技术栈如下

  1. 使用poi-tl来作为报表模板,生成word文档
  2. 使用jfreechart来进行各种分析图表生成
  3. 随后将生成word文档转换为PDF即可

开放思路理清后,下面就来了解一下怎么编码把~

前言总所周知,interface是Go中的一个关键字,是一组方法的集合,只定义了方法的形态,同时也是Go中多态的一种实现方式。 123456type interfaceName interface { TODO() // ...some method} 关于接口的命名,我们通常以er作为后缀,表示某个行为。根据接口中是否有定义方法,运行时Go中分...
Go

前言

在Go的各种框架中,总是能看见context的身影,它被用来进行数据传递、超时通知等。

context在Golang1.7的版本被引入,它被称为协程的上下文,用来在各个协程之间进行上下文信息传递,例如:取消信号、超时信号、数据传递等。这种传递不仅只传送给被调用者、context能够进行链式的调用。

Go

线程不安全的map

总所周知,Go中内置容器Map是线程不安全的,当有多个协程同时进行操作,会抛出fatal error: concurrent map writes的错误,例如下面的例子

1
2
3
4
5
6
7
8
func testMap() {
m := make(map[string]int)
for i := 0; i < 100; i++ {
go func(num int) {
m[fmt.Sprintf("%d", num)] = num
}(i)
}
}

因此如果我们有多个协程同时操作map的需求,就不能直接使用map啦。通常我们可以通过加读写锁(sync.RWMutex)或者使用sync.Map来保证线程安全。

Go

方法集Golang中每一个类型所对应的方法,我们把它称为方法集,按方法接收者来划分可以分为:实体类型和指针类型。如下例子: 12345678910111213type Student struct { Age int Name string}// 实体类型方法接收者func (s Student) showName() &#...
Go

前言

Go跟Java一样都是自动垃圾回收、简称GC,即在后台运行一个守护线程,监控各个对象的状态,识别并且释放不在使用的对象的内存空间。

目前Go使用的垃圾回收策略是三色标记法+混合写屏障,下面就来学习一下GC的细节把。

Go

GMP模型

  • G:即goroutine协程,每个Go关键字都会创建一个协程,协程在当创建的时候大约只占2MB,在不断的运行中可以按需增大(最大1GB)和缩小。
  • M:即操作系统线程,Go中默认最多创建10000线程,同时每个Go协程都需要M上才能运行。
  • P:即调度器,负责将协程调度到线程上,默认数量为CPU核心数,每一个M都与一个P对应。
Go

前言

Go中channel是一个核心类型,用于协程直接的通信以实现并发通信。

Go中对于并发编程有个核心思想:不要通过共享内存来通信,而是通过通信来共享内存,channel即是这一思想的实现。

Go

前言

map是Golang内置的一个键值对容器,在开发中经常用到同时API简单易用,那么它和其他语言的关于map的实现有什么不同吗?下面就来学习一下~

Go

前言

在学习GO语言中,有两个常用内存分配的关键字:new和make,它们都可以用来为变量分配内容。在一些面试题上也会问到它们有什么区别,那么下面就来学习一下。

Go