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

前言总所周知,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

前言

这几年随着Go的发展,Go语言也是越来越火了,随意打开一个招聘软件都能发现有许多Go的招聘岗位。

那么我作为一个Javaer也开始学习Go的相关知识,Go的语法并不难学甚至还比较简单,但Go的思想、项目开发却与大多数的OOP语言有些不同。下面就来我就来描述一下自己在使用Go进行项目实践开发中遇到的疑惑吧,欢迎大伙在评论区交流一下。

Go