go
文章平均质量分 60
oguro
无
展开
-
用go log库实现Debug, Info, Error级别的log
package mylog import ( "log" "os") var ( Debug *log.Logger Info *log.Logger Error *log.Logger) func init() { log.Println("init ...") Debug = log.New(os.Stdout, "[DEBUG] ", log.Ldate|log.Ltim.原创 2021-08-27 14:06:25 · 1046 阅读 · 0 评论 -
k8s自定义controller: code generator自动生成代码
为什么要做controllercontroller的作用就是监听指定对象的新增、删除、修改等变化,针对这些变化做出相应的响应(例如新增pod的响应为创建docker容器),如上图,API对象的变化会通过Informer存入队列(WorkQueue),在Controller中消费队列的数据做出响应,响应相关的具体代码就是我们要做的真正业务逻辑;自动生成代码是什么从上图可以发现整个逻辑还是比较复杂的,为了简化我们的自定义controller开发,k8s的大师们利用自动代码生成工具将contr.原创 2021-07-23 09:34:01 · 1724 阅读 · 3 评论 -
go语言的局部变量在堆上还是栈上?
当浏览器访问一个网站时,浏览器会使用DNS协议去查找他具体的地址。知道了目标地址,浏览器就开始打包它的请求。对于普通的浏览请求,往往会使用HTTP协议;DNS,HTTP,HTTPS所在的层我们称为应用层。经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过socket编程来实现,我们称为传输层。传输层有两种协议,一种是无连接的协议UDP,一种是面向连接的协议TCP。TCP协议里面会有两个端口,一个是浏览器监听的端口,一个是电商的服务器监听的端口。操作系统往往通过端口...原创 2021-06-06 16:18:31 · 1491 阅读 · 2 评论 -
iota
iota是go语言的常量计数器,只能在常量的表达式中使用。iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。举个例子:const ( n1 = iota //0 n2 //1 n3 //2 n4 //3 )几个常见的iota示例:使用_跳过某些值const ( n1 = iot原创 2021-04-12 13:47:13 · 203 阅读 · 0 评论 -
goroutine调度详解,以及进程、线程、协程区别
1. 进程通俗点讲,程序(比如你写的爬虫程序,http服务器等)运行起来就是进程。每个进程都有自己的独立内存空间,拥有自己独立的地址空间、独立的堆和栈,既不共享堆,亦不共享栈。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。进程的状态转移图进程间的通信方式管道(Pipe...原创 2021-04-09 15:27:31 · 1227 阅读 · 0 评论 -
2021-04-07 粘包改写
server//服务端解包过程package mainimport ( "fmt" "net" "nianbao/protocol" "os")func main() { netListen, err := net.Listen("tcp", ":9988") CheckError(err) defer netListen.Close() Log("Waiting for clients") for { conn, er.原创 2021-04-07 13:44:46 · 200 阅读 · 0 评论 -
GOLANG中TCP SOCKET粘包问题和处理
在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串:{"Id":1,"Name":"golang","Message":"message"}当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如:{"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang"原创 2021-04-07 13:41:44 · 1310 阅读 · 2 评论 -
Go实现管道(pipe)
管道(pipe)是一种半双工的(或者说是单向的)通讯方式,它只能被用于父进程和子进程以及同祖先的子进程之间的通讯。使用管道需注意以下四种情况:- 如果所有指向管道写端的文件描述符都关闭了,仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。- 如果有指向管道写端的文件描述符没关闭,持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。...原创 2021-04-06 14:53:06 · 2364 阅读 · 0 评论 -
golang中创建错误的方法
在本教程中,我们会学习如何创建我们自己的自定义错误,并在我们创建的函数和包中使用它。我们会使用与标准库中相同的技术,来提供自定义错误的更多细节信息。使用 New 函数创建自定义错误创建自定义错误最简单的方法是使用 errors 包中的 New 函数。在使用 New 函数 创建自定义错误之前,我们先来看看 New 是如何实现的。如下所示,是 errors 包 中的 New 函数的实现。// Package errors implements functions to manipulate erro原创 2021-01-05 14:44:07 · 1616 阅读 · 0 评论 -
使用GO取得随机字符串
使用GO取得随机字符串的代码方法示例,用了三种方法,差异也不是很大,不过可以在使用中熟悉GO的string库中的一些函数方法,三种方法包括使用字符串拼接的方法;将字符写入slice通过join连接的方法,比第一种方法看起来好些;第三种是通过先打乱slice然后从slice中截取字符串。//第一种方法:取得随机字符串:使用字符串拼接#取得随机字符串:使用字符串拼接func getRandstring(length int) string { if length < 1 { ret.原创 2021-01-04 19:13:14 · 3041 阅读 · 0 评论 -
Go 经典入门系列 21:Go 协程
Go 协程是什么?Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。Go 协程相比于线程的优势 相比线程而言,Go 协程的成本极低。堆栈大小只有若干 kb,并且可以根据应用的需求进行增减。而线程必须指定堆栈的大小,其堆栈是固定不变的。 Go 协程会复用(Multiplex)数量更少的 OS 线程。即使程序有数以千计的 Go 协程,也可能只原创 2020-12-23 14:39:39 · 323 阅读 · 0 评论 -
Go 经典入门系列 24:Select
什么是 select?select语句用于在多个发送/接收信道操作中进行选择。select语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,select会随机地选取其中之一执行。该语法与switch类似,所不同的是,这里的每个case语句都是信道操作。我们好好看一些代码来加深理解吧。示例packagemainimport("fmt""time")funcserver1(chchanstring){time....原创 2020-12-23 14:11:35 · 275 阅读 · 0 评论 -
golang中map并发读写问题及解决方法
一、map并发读写问题如果map由多协程同时读和写就会出现fatalerror:concurrentmapreadandmapwrite的错误如下代码很容易就出现map并发读写问题funcmain(){c:=make(map[string]int)gofunc(){//开一个协程写mapforj:=0;j<1000000;j++{c[fmt.Sprintf("%d",j)]...原创 2020-12-02 18:41:09 · 3020 阅读 · 0 评论 -
Linux下安装Go环境
下载安装包,执行tar解压到/usr/loacl目录下(官方推荐),得到go文件夹等 tar -C /usr/local -zxvf go1.11.5.linux-amd64.tar.gz 添加/usr/loacl/go/bin目录到PATH变量中。添加到/etc/profile或$HOME/.profile都可以# 习惯用vim,没有的话可以用命令`sudo ap...原创 2019-08-01 17:00:44 · 875 阅读 · 0 评论 -
go语言flag包使用
一、命令行语法命令行语法主要有以下几种形式:cmd -flag //只支持bool类型cmd -flag=xcmd -flag x //只支持非bool类型以上语法对于一个或两个‘-’号是一样的对于整形flag,合法的值可以为1234,0664,0x1234或负数等。对于布尔型flag,可以为1,0,t,f,T,F,true,false,TRUE,FALSE,True,...原创 2019-03-12 16:15:24 · 4375 阅读 · 0 评论