Go语言中文网 为您找到相关结果 2091

4. Go 语言数据类型:byte、rune与字符串

Hi,大家好呀,我是一个刚学习 Go 语言不久的新手,在入门 Golang 的这段时间里,我写了很多详细的学习笔记,很适合新手学习噢。这些文章已经发布在我的个人微信公众号里:《Go编程时光》里,今天开始将文章内容搬运到这里,希望有更多的人看到,给更多的人带来帮助,但是这里文章会相对滞后,想获取最新文章,可以前往关注《Go编程时光》,请放心关注,这是一个纯分享的号,完全没有广告。 1. byte 与 rune byte,占用1个节字,就 8 个比特位,所以它和 uint8 类型本质上没有区别,它表示的是 ACSII 表中的一个字符。 如下这段代码,分别定义了 byte 类型和 uint8 类型的变量 a 和 b import "fmt" func main() { var a byte = 6...阅读全文

博文 2020-04-25 20:32:42 Python编程时光

14. Go 语言中的类型断言是什么?

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime Type Assertion Type Assertion(中文名叫:类型断言),通过它可以做到以下几件事情 检查 i 是否为 nil 检查 i 存储的值是否为某个类型 具体的使用方式有两种: 第一种: t := i.(T) 这个表达式可以断言一个接口对象(i)里不是 nil,并且...阅读全文

博文 2020-05-11 09:32:44 Python编程时光

golang程序的基本结构和基本数据类型

1.文件名,关键字和标识符 每个golang程序的源文件都是以.go为后缀结尾 golang有25个关键字 break, default, func, interface, select case, defer, go, map, struct, chan else, goto, package, switch, const fallthrough, if, range, type, continue for, import, return, var 标识符使用字母数字下划线,且必须以字母或下划线开头的字符串序列 另外golang中还预定义了35个标识符 append, bool, byte, cap, close, complex, complex64, complex12 copy, f...阅读全文

博文 2019-04-02 23:34:38 孤风追影

再测Golang JSON类库

写项目一直需要进行序列化,听到了,也看到了很多同学老师对各个golang的json库进行测评。那本人为什么还要继续进行这一次测评呢?因为实践过的知识最有说服力,也是属于自己的,我也希望看到本博文的同学老师可以修改和执行测评的代码执行一遍,我相信会有不一定的体会。本次测评我选择了类库有: 类库 序号 类库 地址 备注 1 encoding/json Golan 2 easyjson github.com/mailru/easyjson 3 ffjson github.com/mailru/easyjson 4 iterator/json github.com/json-iterator/go 主要是针对上述的类型进行,本人采用了对不同的类库使用不同的结构体(仅仅是结构体名称不同,字段顺序和类型...阅读全文

博文 2018-07-02 12:23:23 梦朝思夕

[翻译]GO并发模型二:Pipeline和Cancellation

![image.png](https://static.studygolang.com/190320/6e9e2a4eacd7666eae1d15f42870c383.png) 紧接上文:[[翻译]GO并发模型一:Pipeline和Cancellation](https://zhuanlan.zhihu.com/p/59295820) ## 明确地取消 当主函数在没有从输出channel中接收完所有值便退出时,它必须告诉上游停止数据发送。可以通过向done channel发送停止信号实现。此处有两个可能阻塞的goroutine,所以需发两个值。 ``` func main() { in := gen(2, 3) // Distribute the sq work across two gor...阅读全文

Go基础系列:为select设置超时时间

Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某些情况下的select是否会永久阻塞。很多时候都需要设置一下select的超时时间,可以借助time包的After()实现。 time.After()的定义如下: func After(d Duration) <-chan Time After()函数接受一个时长d,然后它After()等待d时长,等待时间到后,将等待完成时所处时间点写入到channel中并返回这个只读channel。 所以,将该函数赋值给一个变量时,这个变量是一个只读channel,而channel是一个指针类型的数据,所以它...阅读全文

博文 2018-11-23 09:12:10 f-ck-need-u

从 io.Reader 中读数据

目录 [−] io.Reader.Readio.Copyioutil.ReadAllio.ReadFullio.ReadAtLeastio.LimitReader参考资料 Go 的标准库提供了多个从 io.Reader 中读取数据的方法 (io、ioutil),本文通过从 net.Conn中读取数据为例,演示各种方法已经应用场景。 使用TCP连接访问某个网站,采用HTTP 1.0的协议,让TCP连接保持短连接,读取完response之后连接会关闭,这样就模拟了io.EOF的错误: 123456conn, err := net.Dial("tcp", "rpcx.site:80")if err != nil { fmt.Println("dial error:", err) return}de...阅读全文

博文 2019-03-02 15:11:15 smallnest

Golang学习笔记--Channel

如何定义使用 定义 每个通道都有与之关联的类型。此类型是允许通道传输的数据类型。不允许使用该通道传输其他类型的数据。 通道的零值为nil。零通道没有任何用处,因此必须使用类似于 map 和 slice 的make来定义。 package main import "fmt" func main() { var a chan int // 定义 channel if a == nil { fmt.Println("channel a is nil, going to define it") a = make(chan int) fmt.Printf("Type of a is %T", a) // 输出Type of a is chan int } } 使用(接收和发送消息) data := <...阅读全文

Gox语言目前支持的Go语言标准库与第三方库-GX4.2

Gox语言目前内置支持大多数Go语言(Golang)的官方标准库,也支持一些常用的第三方库。这些内置的库使用时无需导入,直接按一定的名称规则使用即可:类似 strings这样一级名称的ku直接使用即可,例如 strings.Contains(a, "b");对于多级的包名,规定“/”字符用下划线“_”代替,其他字符一律去除,例如 net/http直接用net_http引用即可。另外github.com这样的名称将去掉后面的“.com”后缀,例如github.com/topxeq/sqltk用github_topxeq_sqltk引用即可,gonum.org/v1/plot用gonum_v1_plot引用。而像github.com/topxeq/tk这样特别常用的库,还可以直接用tk这样的简称...阅读全文

博文 2020-05-31 22:33:19 陆满庭

【干货分享】大数据开发套件DataIDE使用教程

课程介绍 大数据开发套件(Data IDE) 是阿里云数加重要的Paas平台产品,是”DataWorks”中最重要的核心组件。提供全面托管的工作流服务,一站式开发管理的界面,帮助企业专注于数据价值的挖掘和探索。 大数据开发套件(Data IDE) 基于MaxCompute作为核心的计算、存储引擎,提供了海量数据的离线加工分析、数据挖掘的能力。您可以参见 MaxCompute 简介来对其进行深入了解 。 使用大数据开发套件(Data IDE),可对数据进行数据传输、数据转换等相关操作,从不同的数据存储引入数据,对数据进行转化处理,最后将数据提取到其他数据系统。 产品详情:https://data.aliyun.com/product/ide 课时列表 • 课...阅读全文

Golang通道的无阻塞读写的方法示例

无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯一的解决办法,那就是使用select结构。这篇文章会介绍,哪些情况会存在阻塞,以及如何使用select解决阻塞。阻塞场景阻塞场景共4个,有缓存和无缓冲各2个。无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景:通道中无数据,但执行读通道。通道中无数据,向通道写数据,但无协程读取。// 场景1 func ReadNoDataFromNoBufCh() { noBufCh := make(chan int) <-noBufCh fmt.Println("read from no buffer channel success") // Output: // fatal...阅读全文

博文 2018-11-16 10:35:39 xiao_lili

Go 问答 101

本文译自 Go FAQ 101 版权@归原文所有. 编译器和运行时编译错误 non-name *** on left side of := 什么意思到现在为止(Go 1.10), 对于短变量声明有一个强制性规则: := 左侧的所有条目必须是纯标识符, 并且至少有一个是新变量名. 这意味着容器元素(x[i]), 结构体字段(x.f), 指针解引用(*)以及限制性标识符不能出现在 := 的左侧. 目前, 针对这个问题有一个公开 issue. 看起来 Go 作者们想把这个问题留到 Go 2.0. 编译错误 unexpected newline, expecting { … 什么意思在 Go 中, 我们不能在随意的位置折断一行代码. 具体细节可以阅读 Go 换行规则. 通过该规则, 一般来说, 在大...阅读全文

博文 2019-04-01 14:17:37 lingchao.xin

golang 基础(18)字符串

square-gopher.png 字符串 immutability 字符串是不可变类型 strigs 标准库提供字符串基本操作 strconv 字符串与其他类型的转换 func main() { var c byte = 'H' fmt.Println(c) mj := string(45) fmt.Println(mj) } 我们尝试输出c byte = 'H'``和string(45)`` 72 - 结果可能预期有些差别,如果我们将```mj := string(72)`` 我们就会得到 72 H 在 go 语言会将 sybmol(符号)看作数字,而将string是作为sybmole 的数组 "hello world" 在 go 眼里是数组[72 101 100 108 111...]...阅读全文

Eosforce开发周报 21-jan 2019

工作1. FORCE IBC解决方案中继链BP模式中继合约完成基本合约框架。2. FORCEIO添加bus插件。3. FORCE IBC解决方案中继链实现映射Token合约。4. FORCE IBC解决方案中继链设计Token互换合约实现方案。5. FORCEIO重构账户名实现, 支持定制账户名格式。6. FORCEIO重构系统合约账户初始化实现。7. goeosforce库支持FORCEIO。8. 钱包完善FORCEIO支持。下一周工作1. FORCE IBC解决方案中继链BP模式中继合约开发。2. FORCEIO完成基本的跨链Token映射过程。3. FORCE IBC解决方案中继链实现基本的Token互换合约。4. 实现一个简单的FORCEIO golang客户端链接库。EOSForc...阅读全文

博文 2019-01-25 22:34:43 苏博明

数据结构和算法(Golang实现)(26)查找算法-哈希表

哈希表:散列查找 一、线性查找 我们要通过一个键key来查找相应的值value。有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链接到链表上。 这种链表查找,最坏的时间复杂度为:O(n),因为可能遍历到链表最后也没找到。 二、散列查找 有一种算法叫散列查找,也称哈希查找,是一种空间换时间的查找算法,依赖的数据结构称为哈希表或散列表:HashTable。 Hash: 翻译为散列,哈希,主要指压缩映射,它将一个比较大的域空间映射到一个比较小的域空间。 简单的说就是把任意长度的消息压缩到某一固定长度的消息摘要的函数。Hash 算法虽然是一种算法,但更像一种思想,没有一个固定的公式,只要符合这种思想的算法都称 Hash 算法。 散...阅读全文

博文 2020-04-07 16:32:50 陈星星

第四章 符合数据类型

复合数据类型包括数组,切片,map,结构体 数组 数组是一个由固定长度的特定类型的元素组成的序列,一个数组可以由零个或多个元素组成。 因为数组的长度固定,所以golang中很少直接使用数组,都是使用和数组对应类型的slice 汉译 切片 它是可以增长和收缩的动态序列,slice功能也更灵活,但是要理解slice 工作原理的话首先需要理解数组,因为slice就是基于数组做片段化引用的这么个东西 在数组字面值中,如果在数组长度位置出现“…” 省略号,则表示数组的长度是按照初始化长度来计算的。数组的长度是数组类型的组成部分[3]int 不是一个类型[4]int!! Slice 切片代表一个变长序列,序列中每一个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中元素的类型;...阅读全文

博文 2018-11-19 07:34:39 zhaoxi_yu

golang-sync.WaitGroup

使用 go 语言提供的方式处理:sync.WaitGroup package main import ( "fmt" "sync" ) /** channel 例子六: 接收方,接收完毕的时候,通知发送我接收完毕了! 使用 Go 语言提供的 sync.WaitGroup 的方式,来等待任务结束处理!之前处理方式比较繁琐 // 使用 go 语言提供的等待组,等待组 var wq sync.WaitGroup // 表示有多少个任务,比如添加20个任务 wq.Add(20) // 每个任务做完后,在任务做完后调用 wq.Done() // 等待任务做完,在任务开始后调用 wq.Wait() */ // c 这个chan 表示数据 func donWorker6(id int, c chan in...阅读全文

博文 2019-12-18 12:32:43 爱吃豆包

goroutine、channel原理

goroutine原理 概念介绍 并发 ⼀个CPU上能同时执⾏多项任务,在很短时间内,CPU来回切换任务执⾏(在某段很短时间内执⾏程序a,然后⼜迅速得切换到程序b去执⾏),有时间上的重叠(宏观上是同时的,微观仍是顺序执⾏),这样看起来多个任务像是同时执⾏,这就是并发。 并⾏ 当系统有多个CPU时,每个CPU同⼀时刻都运⾏任务,互不抢占⾃⼰所在的CPU资源,同时进⾏,称为并⾏。 进程 CPU在切换程序的时候,如果不保存上⼀个程序的状态(context--上下⽂),直接切换下⼀个程序,就会丢失上⼀个程序的⼀系列状态,于是引⼊了进程这个概念,⽤以划分好程序运⾏时所需要的资源。因此进程就是⼀个程序运⾏时候的所需要的基本资源单位(也可以说是程序运⾏的⼀个实体)。 线程 CPU切换多个进程的时候,会花费...阅读全文

博文 2020-05-28 21:32:44 强某某

Golang的数据类型

基本数据类型整型:1.按长度:int8(-128-127)、int16、int32、int642.无符号整型:uint8(0-255)、uint16、uint32、uint64特殊整型:int: 32位操作系统上就是int32,64位操作系统上就是int64uint: 32位操作系统上就是uint32,64位操作系统上就是uint64浮点型:float32 float64复数类型:complex64和complex128布尔类型:bool字符串:stringbyte类型和rune类型byte 和 run...阅读全文

博文 2020-05-13 16:32:54 lghCode

golang标准库中的sort包

一、sort包的内容,以及使用 sort包提供了排序切片和用户自定义数据集以及相关功能的函数。 sort包主要针对[]int、[]float64、[]string、以及其他自定义切片的排序。 接口 func Interface interface 结构体 type IntSlice struct type Float64Slice type StringSlice 函数 func Ints(a []int) func IntsAreSorted(a []int) bool func SearchInts(a []int, x int) int func Float64s(a []float64) func Float64sAreSorted(a []float64) bool func Se...阅读全文

博文 2018-12-12 15:34:47 laijh

基本类型介绍

Golang 有更明确的数字类型命名,支持 Unicode,支持常用数据结构。 WX20190219-003105@2x.png 支持八进制、 十六进制,以及科学记数法。标准库 math 定义了各数字类型取值范围。 a, b, c, d := 071, 0x1F, 1e9, math.MinInt16 空指针值 nil,而非C/C++ NULL。 基本类型应用: bool:只能存true和false uint uint8 uint16 uint32 uint64 uintptr byte // uint8 的别名 :字符类型 rune // int32 的别名,代表一个Unicode码,用UTF-8 进行编码。 rune 类型在什么时候使用呢? 例如需要遍 历字符串中的字符。可以循环每个字节...阅读全文

博文 2019-02-19 03:35:23 weifansym

一次UDP通迅的问题排查

通迅模型 (A-->B-->A):A通过UDP发送数据给B(A可以是指定目的地,也可以是广播发送消息给B),B收到消息后根据来源地址和端口向A回发消息,就这么简单的一个通迅过程。 关于golang udp方面的讲解可以参考下https://colobu.com/2016/10/19/Go-UDP-Programming/这篇文件,讲的挺详细。什么时候udp socket是connected状态,什么时候是unconnected状态,什么时候用read/write,什么时候用readFromUDP/writeToUDP都有说明,写的挺好。 来段code demo吧 服务端: func main() { // 创建监听 sock, err := net.ListenUDP("udp4", &ne...阅读全文

Golang | IO库

一、io 1、两个接口 Go 的 io 包提供了 io.Reader 和 io.Writer 接口,分别用于数据的输入和输出; Go 官方提供了一些 API,支持对内存结构,文件,网络连接等资源进行操作; 围绕io.Reader/Writer,有几个常用的实现: net.Conn, os.Stdin, os.File: 网络、标准输入输出、文件的流读取 strings.Reader: 把字符串抽象成Reader(类似流那样,这样就有各种API了) bytes.Reader: 把[]byte抽象成Reader bytes.Buffer: 把[]byte抽象成Reader和Writer bufio.Reader/Writer: 抽象成带缓冲的流读取(比如按行读写) 什么是流?流是一种数据的载体,...阅读全文

博文 2020-04-06 00:34:21 _Liu_

golang-channel

缓冲的 chan, make(chan int, 缓冲大小): 表示满了 缓冲大小后 就开始堵塞,无法在往 管道 塞入数据 不带缓冲区 chan,make(chan int) : 就是放入数据之后,没有取出这个数据就无法在继续放入数据 cap(ch1) 可以查看缓冲区长度 len(ch1) 可以查看缓冲区有多少未读的缓存数据 例子一 package main import ( "fmt" "time" ) // 理念:不要通过共享内存来通信;通过通信来共享内存 /** channel 例子一 channel 既然有了发送方, 就必须要有接收方!!! */ func worker(c chan int) { for { // 从 channel 里面获取数据,赋值给 n n := <-c fm...阅读全文

LeetCode 1311. Get Watched Videos by Your Friends

链接: https://leetcode-cn.com/problems/get-watched-videos-by-your-friends/ 难度:medium 解题思路:广搜找到对应level的所有朋友,然后累加相应的video,最后排序。go语言没有啥priority queue,图简单这里排序用的直接插入排序,有点挫 Golang的数据结构支持太少了,各种都要自己写,真是麻烦。。 func watchedVideosByFriends(watchedVideos [][]string, friends [][]int, id int, level int) []string { visited := map[int]int{} queue := []Person {Person{i...阅读全文

博文 2020-05-15 23:32:47 码农老姜

golang mongoldb

使用gopkg.in/mgo.v2库操作,插入操作主要使用mongodb中Collection对象函数原型 func (c *Collection) Find(query interface{}) *Query 查找的时候Find的参数都会用bson.M类型 type M map[string]interface{} 例如:bson.M{"name": "Tom"}相当直接mongodb的查询条件{"name": "Tom"} 连接数据库 package main import ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) // get mongodb db func getDB() *mgo.Database { session, e...阅读全文

博文 2019-08-29 20:32:45 Steven_25bb

MaxCompute访问TableStore(OTS) 数据

摘要: MaxCompute作为阿里云大数据平台的核心计算组件,承担了集团内外大部分的分布式计算需求。 免费开通大数据服务:https://www.aliyun.com/product/odps **前言** MaxCompute作为阿里云大数据平台的核心计算组件,承担了集团内外大部分的分布式计算需求。而MaxCompute SQL作为分布式数据处理的主要入口,为快速方便处理/存储EB级别的离线数据提供了强有力的支持。 随着大数据业务的不断扩展,新的数据使用场景在不断产生,在这样的背景下,MaxCompute计算框架也在不断的演化,原来主要面对内部特殊格式数据的强大计算能力,也正在一步步的开放给不同的外部数据。 之前我们介绍了怎样[在MaxCompute上处理存储在OSS上...阅读全文

老弟在吗,我怀疑Go标准库中的二分查找有bug!

"老弟在吗,我怀疑Go标准库中的二分查找有bug!" "老哥别慌,源码之前没有秘密,你坐下听我吹吹c++的牛逼。。" 下面这段Go代码,你觉得index的结果是多少? arr := []int{1, 3, 5, 7} index := sort.Search(len(arr), func(i int) bool { return arr[i] == 3 }) index的结果并不是1,而是4。(额,返回4是什么鬼,难道不应该找到就返回对应的下标,找不到就返回-1吗) 我们映象中的二分是这样的: while (low <= high) { mid := (low + high) / 2 if arr[mid] < target { low = mid + 1 } else if arr[mid...阅读全文

博文 2020-05-01 14:32:40 就想叫yoko

从插入排序来理解 Go 的接口

插入排序 根据插入排序的思想,我们很容易就可以完成插入排序的代码如下。 func insertionSort(data []int) { lo, hi := 0, len(data) - 1 for i := lo + 1; i < hi; i++ { for j := i; j > lo && data[j] < data[j-1]; j-- { data[j], data[j-1] = data[j-1], data[j] } } } 复制代码我们可以验证一下,确实没有问题。 package main import ( "fmt" ) func main() { nums := []int{2, 3, 4, 1, 7, 9, 10, 21, 17} insertionSort(nums)...阅读全文

博文 2019-12-03 11:34:19 咔叽咔叽

MySQL数据库入门学习

课程介绍 本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 课程目标 让小白也能够熟练掌握常用的数据库使用技巧,理解数据库的存储结构 适合人群 数据库入门学习者 前端学习者 课时列表 • 课时1: MySQL概要 • 课时2:MySQL在windows下的安装 • 课时3:MySQL在linux下的安装 • 课时4:MySQL在Mac下的安装 • 课时5:MySQL配置 • 课时6:添加和删除数据库(DB) • 课时7:数据类型 • 课时8:添加和删除数据表(table) • 课时9:给数据表添加或者删除列 • 课时10:修改某个数据列的名字或者数据类型 • 课时...阅读全文

7. Go 语言数据类型:指针

Hi,大家好。 我是明哥,在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 0. 什么是指针 当我们定义一个变量 name var name string = "Go编程时光"复制代码 此时,name 是变量名,它只是编程语言中方便程序员编写和理解代码的一个标签。 当我们访问这个标签时,机算机会返回给我们它指向的内存地址里存储的值:Go编程时光。 出于某些需要,我们会...阅读全文

博文 2020-04-29 11:35:21 王一白

go语言之JSON与md5值

go语言之JSON与md5值 一、Json是什么? 是一种轻量级的数据交换语言,用于数据交换。Json由于比XML更小、更快、更易解析,以及浏览器的内建快速解析支持,使得其更实用于网络数据交互。目前我们看到很多的开放平台,基本上都是采用了JSON作为他们的数据交互的接口。go语言提供了内置的encoding/json 标准库,在github上提供了更快的json标准库,github.com/pquerna/ffjson/ffjson 二、JSON数据的编码和解码 编码函数: func Marshal(v interface{}) ([]byte,error) 解码函数: func Unmarshal(data []byte, v interface{}) error 三、代码实现Json编码...阅读全文

博文 2018-10-24 16:35:13 PowerMichael

25. 学习 Go 协程:详解信道/通道

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime Go 语言之所以开始流行起来,很大一部分原因是因为它自带的并发机制。 如果说 goroutine 是 Go语言程序的并发体的话,那么 channel(信道) 就是 它们之间的通信机制。channel,是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道...阅读全文

博文 2020-06-02 08:32:41 Python编程时光

使用golang反向代理统计api访问次数

前言 今天写点有趣的小东西。事情是这样的,我经常看到有些软件加了统计数据的sdk,之后就可以实现统计接口的访问量,接口负载等等数据。而这些功能不需要原有的软件做些什么,对原来的业务完全无入侵,我觉得这样的功能很有实用性,所以没有参考其他类似的软件或者工具,我想自己试试怎么实现这样的功能。 思路 首先,我们先给要做的工具起个名字,就叫monitor。要实现无侵入,那么只能是在业务软件外面套一层,经由业务软件的流量,都需要经过monitor这一层,这让人很容易得想到了网关的功能也是类似的。恰好,golang实现反向代理十分简单。所以,思路就有了。先实现一个反向代理,将经由业务的流量都由monitor反向代理给业务软件。接着,将访问的api放进通道中,对api进行分类,就可以统计api的访问量了。...阅读全文

博文 2020-03-15 15:32:43 onepunchgo

Golang通道的无阻塞读写

无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯一的解决办法,那就是使用select结构。 这篇文章会介绍,哪些情况会存在阻塞,以及如何使用select解决阻塞。 阻塞场景 阻塞场景共4个,有缓存和无缓冲各2个。 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景: 通道中无数据,但执行读通道。 通道中无数据,向通道写数据,但无协程读取。 // 场景1 func ReadNoDataFromNoBufCh() { noBufCh := make(chan int) <-noBufCh fmt.Println("read from no buffer channel success") // Output: /...阅读全文

博文 2018-11-02 15:34:43 shitaibin

golang快速入门[3]-go语言helloworld

golang快速入门[3]-go语言helloworld 在之前,我们介绍了如何在windows、macos以及linux平台构建go语言的开发环境 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速入门[2.3]-go语言开发环境配置-linux 本文将介绍如何书写、编译、并运行第一个go语言程序 同时详细介绍其内部机制 书写第一个go语言程序 首先我们可以在任意位置新建一个文件,命名为main.go go源文件以.go作为后缀,命名时建议统一为小写英文字母 用任意的文本编辑器(vim,notepade,emacs…)编辑文件,书写如下代码 package main import "fmt...阅读全文

博文 2020-02-12 07:32:58 唯识相链2

探索 Go 语言数据类型的内部实现

向新程序员讲解 Go 语言的时候,必要的是解释 Go 各种数据值在内存中的组织来给他们建立正确的思想,知道哪些操作是开销昂贵的,哪些是不昂贵的。这篇文章就是关于基本类型,结构,数组和切片的内部实现原理。基本类型让我们从一个简单的例子开始 图1 变量 i 的类型是 int, 在内存中用一个32比特位的字来表示。j 的类型是 int32 ,由于显示类型转换。即使 i 和 j 由相同的内存布局,他们本质上还是不同的类型:在 Go 中直接 i = j 赋值将会产生一个错误,我们必须显示的转化 j,i = int(j)。值 f 的类型是 float,在内存中用 32 比特位的浮点值格式表示,它和 int32 有相同的内存使用量但是内部布局是不同的,感兴趣的可以去了解一个浮点数如何在内存中表示。结构体和...阅读全文

博文 2020-05-29 13:32:54 CXX_FLAGS

剖析nsq消息队列(三) 消息传输的可靠性和持久化[二]diskqueue

剖析nsq消息队列-目录 上一篇主要说了一下nsq是如何保证消息被消费端成功消费,大概提了一下消息的持久化,--mem-queue-size 设置为 0,所有的消息将会存储到磁盘。 总有人说nsq的持久化问题,消除疑虑的方法就是阅读原码做benchmark测试,个人感觉nsq还是很靠谱的。 nsq自己实现了一个先进先出的消息文件队列go-diskqueue是把消息保存到本地文件内,很值得分析一下他的实现过程。 整体处理逻辑 go-diskqueue 会启动一个gorouting进行读写数据也就是方法ioLoop 会根据你设置的参数来进行数据的读写,流程图如下 evernotecid://D2602A6B-6F53-4199-885D-97DFC21CBA3E/appyinxiangcom/2...阅读全文

博文 2019-11-15 18:04:17 li_peng

小白也能够熟练掌握常用的数据库使用技巧

课程介绍 本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 课程目标 让小白也能够熟练掌握常用的数据库使用技巧,理解数据库的存储结构 适合人群 数据库入门学习者 前端学习者 课时列表 • 课时1: MySQL概要 • 课时2:MySQL在windows下的安装 • 课时3:MySQL在linux下的安装 • 课时4:MySQL在Mac下的安装 • 课时5:MySQL配置 • 课时6:添加和删除数据库(DB) • 课时7:数据类型 • 课时8:添加和删除数据表(table) • 课时9:给数据表添加或者删除列 • 课时10:修改某个数据列的名字或者数据类型 • 课时...阅读全文

[译] Part 30: Golang 中的Error处理

文地址:Part 30: Error Handling 原文作者:Naveen R 译者:咔叽咔叽 转载请注明出处。 什么是Error? Error表示程序中的异常情况。假设我们正在尝试打开文件,文件系统中不存在该文件,那么这是一种异常情况,它就代表一种error。 Go中使用内置的error类型表示错误。 就像任何其他的内置类型,如int,float64,... error可以存储在变量中,从函数返回等等。 例子 用打开了一个不存在的文件的示例程序来解释一下。 package main import ( "fmt" "os" ) func main() { f, err := os.Open("/test.txt") if err != nil { fmt.Println(err) ret...阅读全文

博文 2019-03-31 18:34:39 咔叽咔叽_7647

通过例子学习 Go 和 Rust ---- 类型与泛型

这两门语言都是强类型的,不过rust由于其特有的Trait机制,使得咱可以在编写函数的时候不指定参数类型,取而代之只指定类型所具有的Trait。go语言中一般就只针对某种类型来编写函数。 咱举个例子,对比一下rust和go标准库中是如何比较bytes的。 Go func Compare(a, b []byte) int { l := len(a) if len(b) < l { l = len(b) } if l == 0 || &a[0] == &b[0] { goto samebytes } for i := 0; i < l; i++ { c1, c2 := a[i], b[i] if c1 < c2 { return -1 } if c1 > c2 { return +1 } } s...阅读全文

博文 2020-03-04 18:33:42 Tericoder

golang文件操作-读操作的常见方式汇总

1、ioutil读取整个文件(io/ioutil) ioutil的方式能够读取整个文件,只需传入文件名,操作简单。该操作方式需要把文件读入内容,效率高,同样占用内存也高 func ReadFile(filename string) ([]byte, error)ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。 // ioutil.ReadFile读取整个文件 func main() { content, err := ioutil.ReadFile("./main.go") if err != nil { fmt.Println("read file f...阅读全文

博文 2020-03-08 19:32:40 司国瑞

Golang 源码剖析:log 标准库

Golang 源码剖析:log 标准库 日志 输出 2018/09/28 20:03:08 EDDYCJY Blog... 构成 [日期]<空格>[时分秒]<空格>[内容]<\n> 源码剖析 Logger type Logger struct { mu sync.Mutex prefix string flag int out io.Writer buf []byte } mu:互斥锁,用于确保原子的写入 prefix:每行需写入的日志前缀内容 flag:设置日志辅助信息(时间、文件名、行号)的写入。可选如下标识位: const ( Ldate = 1 << iota // value: 1 Ltime // value: 2 Lmicroseconds // value: 4 Llongf...阅读全文

博文 2019-03-26 09:30:33 EDDYCJY

13.Go语言标准库之time包

1.time包 time包提供了时间的系那是和测量用的函数。日历的计算采用的是公历。 1.1时间类型 time.Time类型表示时间。我们可以通过time.Now()函数获取当前的事件对象,然后获取时间对象的年月日时分秒等信息。 package main import ( "fmt" "time" ) func main() { now := time.Now() //获取当前时间 fmt.Printf("current time:%v\n", now) year := now.Year() //年 month := now.Month() //月 day := now.Day() //日 hour := now.Hour() //小时 minute := now.Minute() //分钟...阅读全文

博文 2020-02-06 20:33:17 DevOperater

数据结构和算法(Golang实现)(18)排序算法-前言

排序算法 人类的发展中,我们学会了计数,比如知道小明今天打猎的兔子的数量是多少。另外一方面,我们也需要判断,今天哪个人打猎打得多,我们需要比较。 所以,排序这个很自然的需求就出来了。比如小明打了5只兔子,小王打了8只,还有部落其他一百多个人也打了。我们要论功行赏,谁打得多,谁就奖赏大一点。 如何排序呢,怎么在最快的时间内,找到打兔子最多的人呢,这是一个很朴素的问题。 经过很多年的研究,出现了很多的排序算法,有快的有慢的。比如: 插入类排序有:直接插入排序和希尔排序 选择类排序有:直接选择排序和堆排序 交换类排序有:冒泡排序和快速排序 它们的复杂度如下: 稳定性概念 定义:能保证两个相等的数,经过排序之后,其在序列的前后位置顺序不变。(A1=A2,排序前A1在A2前面,排序后A1还在A2前面)...阅读全文

博文 2020-04-07 16:32:36 陈星星

Go实现数据结构--栈

使用golang语言的interface接口类型创建栈,栈可以操作各种数据类型,非常简洁方便 package main import "fmt" // 栈:先进后出,从栈顶取数据,栈低固定 type Stack struct { Top int // 栈顶 Capacity int // 栈容量 Prt *[]interface{} // 指向栈指针 } // 初始化栈 func (s *Stack) StackInitial(capacity int){ s.Capacity =capacity s.Top =0 // 使用interface类型,所有数据类型都能兼容 m:= make([]interface{},capacity) s.Prt =&m } // 元素入栈,栈顶上升 fun...阅读全文

博文 2020-04-09 18:32:54 阿鸠先生

数据结构和算法(Golang实现)(28)查找算法-AVL树

AVL树 二叉查找树的树高度影响了查找的效率,需要尽量减小树的高度,AVL树正是这样的树。 一、AVL树介绍 AVL树是一颗严格自平衡的二叉查找树,1962年,发明者Adelson-Velsky和Landis发表了论文,以两个作者的名字命名了该数据结构,这是较早发明的平衡二叉树。 定义如下: 首先它是一颗二叉查找树。 任意一个节点的左右子树最大高度差为1。 由于树特征定义,我们可以计算出其高度h的上界h<=1.44log(n),也就是最坏情况下,树的高度约等于1.44log(n)。 假设高度h的AVL树最少有f(h)个节点,因为左右子树的高度差不能大于1,所以左子树和右子树最少节点为:f(h-1),f(h-2)。 因此,树根节点加上左右子树的节点,满足公式f(h) = 1 + f(h-1) ...阅读全文

博文 2020-04-07 16:32:57 陈星星

Reflect-Go一分钟快速入门

Reflect 本文侧重讲解reflect反射的实践应用,适合新手初窥门径。 reflect两个基本功能 reflect.TypeOf() 动态获取输入数据的类型 reflect.ValueOf() 动态获取输入数据的值 func TypeOf(i interface{}) Type func ValueOf(i interface{}) Value 通过reflect.Type和reflect.Value支持的方法,可以对输入的动态数据进行解析。那么了解reflect.Type和reflect.Value提供的方法尤为重要,因为比较多,此介绍放在文末。 reflect.Kind 在reflect.Type和reflect.Value上调用Kind()方法,可以得到reflect.Kind类...阅读全文

博文 2020-01-10 17:32:41 tinson

Go 每日一库之 jsonrpc

简介 在上一篇文章中我们介绍了 Go 标准库net/rpc的用法。在默认情况下,rpc库内部使用gob格式传输数据。我们仿造gob的编解码器实现了一个json格式的。实际上标准库net/rpc/jsonrcp中已有实现。本文是对上一篇文章的补充。 快速使用 标准库无需安装。 首先是服务端,使用net/rpc/jsonrpc之后,我们就不用自己去编写json的编解码器了: package main import ( "log" "net" "net/rpc" "net/rpc/jsonrpc" ) type Args struct { A, B int } type Arith int func (t *Arith) Multiply(args *Args, reply *int) error...阅读全文

博文 2020-05-11 22:32:47 darjun

基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.9.0版)

TableGo_20200520 v6.9.0 正式版发布,此次版本更新如下:1、新增对JDK9及以上版本Java环境的支持2、生成JavaBean更名为生成数据模型并且提供了C#、C++、Golang、Rust、Python、Objective-C、Swift等编程语言数据模型的简单模板3、新增生成SpringBoot项目工程的功能,在生成自定义文件界面直接生成一个可以跑起来的项目4、新增对数据库视图的支持5、新增大量自定义模板示例6、新增SQL查询导出数据功能,在生成自定义文件时通过配置SQL查询数据导出生成任何需要的文件7、新增一些内置静态对象用于生成自定义文件时使用,例如:org.apache.commons.lang.StringUtils8、移除是否目录直通,如果文件保存路径设置...阅读全文

博文 2020-05-31 22:33:14 TableGo