并发问题的解决思路以及Go语言调度器工作原理

上周的文章《Go并发编程里的数据竞争以及解决之道》最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与。今天的文章我首先说一下上篇文章里的思考题的解决思路,我会给出完整可运行的代码。之后通过观察程序的运行结果里的现象简单介绍Go语言的调度器是如何对goroutine进行调度的。 回答上周的问题 先来回顾一下上周文章里思考题的题目: 假设有一个超长的切片,切片的元素类型为int,切片中的元素为乱序排列。限时5秒,使用多个go...阅读全文

Segmentfault 2020-06-08 09:32:34 Kevin

GRPC源码分析 1.代码结构以及通用组件解析

base in https://github.com/grpc/grpc-... 目录概览 可选项(Opts 包装(Wrapper 组件式编程(Builder & Regist 一次性事件(grpcsync.Event 无界channel(UnboundedBuffer 目录概览 摘要了一部分文件目录,用来描述在grpc中不同目录层级的主要作用。 grpc ├── 顶层目录(package grpc, 主要包含一些grpc提供的接口文件和涉及到具体实现的一些包装器文件 ├── clientcon...阅读全文

Segmentfault 2020-06-08 09:32:34 pojol

GO 里面的比较好用的一些工具方法【值得收藏】

今天在一个源码里面看到里面的 util 包,里面的好多的工具都是我们可以直接拿来使用的,之前没有这个习惯,所以每次就喜欢到处找。现在开始在这些源码里面去记录一下。方便日后的使用。 // 这里是引入的包 import ( "crypto/rand" "crypto/sha256" "crypto/md5" "encoding/base64" "encoding/hex" "errors" "golang.org/x/crypto/pbkdf2" "strings" "github.com/graf...阅读全文

Segmentfault 2020-06-08 08:32:34 IT猿看视界

Go 中的接口的定义与使用

Go 里面的接口,绝对是我入坑程序员以来觉得最坑的一个东西了。为什么说它坑,就是怎么看怎么别扭。 说明 Go 中的接口是由使用者来定义的。这和传统的 接口 有点不一样(当然我们在开发的过程中可以根据具体的情况去决定谁用接口) 看一个例子: // package mooc type Retriever struct { Contents string } func (r Retriever) Get(url string) string { return r.Contents } // packa...阅读全文

Segmentfault 2020-06-08 01:33:02 IT猿看视界

27. 学习 Go 协程:WaitGroup

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 在前两篇文章里,我们学习了 协程 和 信道 的内容,里面有很多例子,当时为了保证 ...阅读全文

Segmentfault 2020-06-07 15:32:37 Python编程时光

golang基础学习-动态获取配置文件(viper)

项目中经常获取一些常用配置文件,当有配置文件中的参数被修改后,如何的实时获取配置文件就很关键了。这里推荐"viper"这个包,用来实时获取配置文件。 1.VIPER简介 viper【蝰蛇】 Viper是适用于Go应用程序的完整配置解决方案。它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持: 设置默认值 从JSON,TOML,YAML,HCL,envfile和Java属性配置文件中读取 实时观看和重新读取配置文件(可选) 从环境变量中读取 从远程配置系统(etcd或Consul...阅读全文

Segmentfault 2020-06-07 15:32:36 wmm369

Golang 框架学习:搭建beego

框架简介 beego 是一个快速开发 Go 应用的 HTTP 框架,它可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。 我所使用的学习资料: beego 官方文档:https://beego.me/ beego学习路线图(见文末) MVC设计模式 beego是一个典型的MVC设计模式:...阅读全文

Segmentfault 2020-06-07 15:32:36 sunlingbot

Golang 标准库:strconv 包的应用

strconv包 strconv包主要用于字符串与其他类型的转换。一般来说,几乎所有的类型都能被转换成字符串,但是从字符串转换成其他类型就不一定能成功了。 从数字类型转换到字符串,我们可以使用strconv.Itoa和strconv.FormatFloat()等函数,Itoa是把十进制数转换成字符串,FormatFloat是将64位浮点型的数字转换成字符串。 strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) 其中,fm...阅读全文

Segmentfault 2020-06-07 15:32:35 sunlingbot

Golang 复合数据类型:接口

接口 Golang 不是传统的面向对象编程语言,它没有类和继承的概念,但是有非常灵活的接口概念,通过它可以实现很多面向对象的特性,接口提供了一种方式来说明这样的行为:如果谁能搞定这件事,它就可以在这里调用。接口定义了一组方法(方法集),这些方法都是抽象的,即不包含实现这些方法的代码,接口也不包含变量。Golang 中的接口方法不会很多,一般只有0~3个方法;而且 Golang 是接口可以有值,表现为一个接口变量或者一个值。 //声明接口类型speaker //不管是什么类型,只要实现了speak...阅读全文

Segmentfault 2020-06-07 07:32:38 sunlingbot

Golang 学习笔记:并发编程

Go 语言的并发原理 Go语言的语法和运行时直接内置了对并发的支持。Go语言里的并发是指能让某个函数独立于其他函数运行的能力。当一个函数创建成为协程goroutine时,会将其视为一个独立的工作单元,这个单元会被调度到可用的逻辑处理器上运行。 在Go语言中,goroutine被称为协程,它们实际是属于用户态线程! 并发与并行 并发: 单位时间段内,多个任务都在执行 (单位时间内不一定同时执行) 并行: 单位时刻内,多个任务同时执行 在操作系统中,我们可以知道,一个线程是一个执行空间,这个空间会被...阅读全文

Segmentfault 2020-06-04 16:32:40 sunlingbot

Golang 标准库:strings 包的应用

strings包 Go语言标准库中也存在这样一个名为strings包,额外封装一些方法用于处理字符串。 包含判断 前后缀包含 func main() { //前后缀包含 var str string = "This is a fat cat" var str1 string = "Hello Boss!" var str2 string = "Lucy is name My" fmt.Printf("T/F? Does the string \"%s\" have prefix %s?\n", ...阅读全文

Segmentfault 2020-06-07 09:32:35 sunlingbot

Golang 复合数据类型:方法

传统的面向对象编程 在面向对象编程(OOP)中,类与对象是面向对象编程的两个主要方面。一个类(Class)能够创建一种新的类型(Type),其中对象(Object)就是类的实例(Instance)。可以这样来类比:你可以拥有类型 int 的变量,也就是说存储整数的变量是 int 类的实例(对象)。 对象可以使用属于它的普通变量来存储数据。这种从属于对象或类的变量叫作字段(Field)。对象还可以使用属于类的函数来实现某些功能,这种函数叫作类的方法(Method)。这两个术语很重要,它有助于我们区...阅读全文

Segmentfault 2020-06-06 18:32:34 sunlingbot

Golang 复合数据类型:结构体

结构体的定义 结构体也是一种复合类型,通常使用带属性的结构体来表示一个现实中的实体。结构体也是值类型,因此可以通过使用 new 函数来创建。Go语言不是一门传统的面向对象的编程语言,因此 Go 中没有类的概念,也不支持类的面向对象概念。结构体是由零个或多个任意类型的值聚合成的实体,每个值都可以称为结构体的成员。 结构体成员也可以称为“字段”,这些字段有以下特性: 字段拥有自己的类型和值; 字段名必须唯一; 字段的类型也可以是结构体,甚至是字段所在结构体的类型。 type Family struc...阅读全文

Segmentfault 2020-06-06 16:32:33 sunlingbot

golang基础学习-Excel使用

一、背景 项目中用到了Excel,主要在两个方面:1、读取excel中的信息;2、根据已知数据,生成excel的报表。 二、简介 因为使用的GO语言开发的项目,用到了"Excelize"这个包。Excelize: 是Go语言编写的用于操作 Office Excel 文档基础库。官网:https://xuri.me/excelize/GitHub: https://github.com/360EntSecG...GO.DEV: https://pkg.go.dev/github.com... 三、...阅读全文

Segmentfault 2020-06-06 14:32:34 wmm369

Golang 复合数据类型:映射

映射(map) 映射是一种数据结构,用于存储一系列无序的键值对,映射基于键来存值,能够快速检索数据。键就像索引一样,指向与该键关联的值。 映射的实现 Go语言中 map 的底层是哈希(hash)表实现的,它的源码在 $GOROOT/src/pkg/runtime/hashmap.go/ 可以查看它的实现细节。Go语言的 map 是一个数组列表,不是像 C++ 一样使用红黑树,与传统的 hashmap 一样,Go语言的 map 由一个个 bucket 组成。在这个数组列表中的每一个元素都被称为 b...阅读全文

Segmentfault 2020-06-05 09:32:34 sunlingbot

Golang 复合数据类型:切片

切片(slice) 切片的底层是数组实现的,可以按需自动增长和缩小。切片是数组的引用,因此是引用类型,不支持直接比较,只能和nil比较。切片的动态增长是通过内建函数append()来实现的,这个函数可以快速且高效地增长切片,也可以通过切片再次切割,缩小每一个切片的大小。 切片不存值,底层数组存值 切片指向一个底层数组 底层数组是占用一块连续的内存空间 创建数组切片 创建两个类型分别为 int 型和 string 型的切片,并初始化 func main(){ var slice1 []int va...阅读全文

Segmentfault 2020-06-05 07:32:57 sunlingbot

redis 学习笔记

#### redis安装 ###### linux 目录结构 * /bin&/sbin ;kernel 二进制可执行程序 * /usr/bin&/usr/sbin&/usr/lib ;(unix software resource) ubuntu/BSD/centOS... 等系统默认自带二进制 可执行程序/动态库 或 通过包管理工具(apt-get/yum)安装的二进制 可执行程序/动态库 * /usr/local/bin&/usr/local/sbin&urs/local/l...阅读全文

Go语言中文网 2020-06-03 15:15:18 loop_0

Golang 复合数据类型:数组

复合数据类型 数组 数组是具有相同类型的一组已知编号且长度固定的数据项序列,这个序列可以是有序的也可以是无序的,组成数组的各个变量称为数组的元素。数组的长度必须是一个非负整数的常量(或常量表达式),数组长度也是数组类型的一部分,所以[4]int和[10]int不是同一种类型。 声明数组 声明数组需要指定元素的数据类型和数组长度(存储元素的数量) //声明一个长度为20的整型数组 var array [20]int 数组一旦声明,它的数据类型和数组长度都不能再更改了。所以,如果需要存储更多的元素,...阅读全文

Segmentfault 2020-06-04 17:32:35 sunlingbot

Golang 学习笔记:反射

反射(Go Reflect) 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可...阅读全文

Segmentfault 2020-06-04 15:32:36 sunlingbot