
GO
他们说快写一首情歌
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Go开发环境搭建
Go开发环境的搭建在CentOS8.2上部署配置Git相关配置Go环境安装Protocol Buffer在CentOS8.2上部署1.配置用户信息2 使用mkdir创建出工作目录-m 权限模式 -v 每次创建新目录都显示日期 -p自动创建上路径上尚不存在的目录3.安装依赖环境yum -y install make autoconf automake cmake perl-CPAN libcurl-devel libtool gcc gcc-c++ glibc-headers zlib-deve原创 2021-08-24 13:54:10 · 294 阅读 · 0 评论 -
Go性能分析工具
Go 性能分析性能分析工具性能分析工具package tool// 安装graphviz brew install graphviz// 将GOPATH加入到/bin加入$PATH// 安装go-torch go get github.com/uber/go-torch// 下载并复制 flamegraph.p1 https://github.com/brendangregg/FlameGraph到$GOPATH/bin// 将$GOPATH/bin 加入$PATH 火炬图//////原创 2021-08-18 17:06:35 · 225 阅读 · 0 评论 -
构建Restful服务
构建Restful构建Restful构建Restfulpackage restfulimport ( "fmt" "log" "net/http")//用第三方提升性能 简化编程//微服务 对外Open服务 通过Http请求 暴漏一些内在的服务//更好的Router http://github.com/julienschmidt/httprouterfunc Hello(w http.ResponseWriter,r *http.Request,ps httprouter.Para原创 2021-08-18 16:38:50 · 130 阅读 · 0 评论 -
HTTP服务
HTTP服务HTTP服务HTTP服务//简单语言+高效协程机制import ( "fmt" "net/http" _"net/http/pprof" "time")func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(w,"Hello World") }) http.HandleFunc("/time", func(w http.Respo原创 2021-08-18 16:11:17 · 117 阅读 · 0 评论 -
Go中Json解析
Json解析Go内置json解析 配置文件解析不用反射的Json解析 Easy解析 网络Go内置json解析 配置文件解析package jsonimport ( "encoding/json" "fmt" "testing")//远程过程调用 或者WebService 程序的配置也会使用JSON//常用 使用反射的模式解析JSON 推荐使用easyJson//利用FeildTag来表示对应的JSON值 高性能不建议使用,反射性能低type BasicInfo struct {原创 2021-08-18 15:27:35 · 608 阅读 · 0 评论 -
Micro-Kernel
微内核模式微内核微内核//内核要包含公共流程或通用逻辑 将可变或可拓展部分过华为拓展点 抽象拓展点行为,定义接口,利用插件进行拓展//易于拓展 错误隔离 保持架构一致性原创 2021-08-18 14:48:02 · 158 阅读 · 0 评论 -
Pipe-Filter
Pipe-Filter数据数据//使用Go实现软甲架构的模式//架构模式 设计较大的可复用方案//23种设计模式//pipe-filter//AdsSSP(请求上来)->RequestParsing解析请求->ParamsProcessing处理参数->Verification认证身份->Filtering过滤->Ranking对选出的广告排序->Filling填充//Pump->Filter->Filiter->Sink//封装了数原创 2021-08-18 14:37:18 · 322 阅读 · 0 评论 -
Go不安全编程
Go不安全编程什么是不安全编程什么是不安全编程package unsafe_programingimport ( "fmt" "sync" "sync/atomic" "testing" "time" "unsafe")//不安全 有一个叫unsafe的包//一般用在和外面C程序实现的高效的库 交互的时候需要//场景使用 比较特定化//Go中不支持强制类型转换 不安全指针可以转换为各种类型的指针type Customer struct { Name string A原创 2021-08-18 13:06:59 · 144 阅读 · 0 评论 -
Go反射编程
Go反射编程什么是反射编程演示代码什么是反射编程//反射编程//reflect.TypeOf返回类型(reflect.Type)//reflect.ValueOf返回值(reflect.Value)//可以从reflect.Value获得类型 可以通过kind来判断类型//拿到一个instance 可以反射出它的类型和它的值//go 用常量代表一个类型枚举,判断类型//使用反射做一些灵活的程序 反射可以灵活的做一些万能程序//以字符串 字符的方式,调用类型中的某一个方法//访问类型中原创 2021-08-18 09:50:28 · 105 阅读 · 0 评论 -
BDD及框架
BDD框架BDD概念BDD常见框架BDD概念//Behavior Driven Development//让业务领域的专家参加开发 在验收测试上发挥作用//敏捷开发模型 stroy card背后写验收要求//Give 在某个背景下 发生了特定事件后 我们对他的期待//When//Then//常用BDD验收框架 go get -u github.com/smartystreets/goconvey/convey//启动项目 WEB UI $GOPATH/bin/goconveyBDD原创 2021-08-17 19:53:04 · 568 阅读 · 0 评论 -
BenchMark
BenchMark方法方法BenchMark 事项BenchMark 实例BenchMark 事项//对某些代码片段性能测评,对第三方库测评,选择最优的方案//不关心benchMark的正确新 不需要做确认//命令行 go test -bench=. (或者benchmark的名称)//go test -bench = .-benchmen 内存大小和次数 性能分析 window下写-bench="."BenchMark 实例import ( "bytes" "testing"原创 2021-08-17 19:32:34 · 379 阅读 · 0 评论 -
Go内置测试单元
GO内置测试单元Go内部测试Go内部测试package until_testimport ( "fmt" "testing")func TestSquare(t *testing.T) { //表格测试法 //一组输入的组合 对一组组合期待的数值 inputs := [...]int{1,2,3} expected:=[...]int{1,4,9} for i:=0;i<len(inputs);i++{ ret := Square(inputs[i]) if原创 2021-08-17 19:02:29 · 101 阅读 · 0 评论 -
关于sync.Pool池
Sync.Poolsync.Pool的特点如何使用Sync.Pool注意事项sync.Pool的特点//sync.Pool 对象缓存,不是一个可以同步的池//更像sync.cache 对象缓存//sync.pool和协程processor具有相关性 私有对象(只能缓存一个对象 协程安全)和共享池(协程不安全)//安全 访问 写入 不需要锁 不安全,访问,写入都需要锁//首先从私有对象中尝试获取 开销最小//如果私有对象不存在,尝试从当前Processor的共享池获取//如果Processo原创 2021-08-17 08:58:02 · 310 阅读 · 0 评论 -
并发任务执行
只运行一次只运行一次仅需任意任务完成所有任务的完成注意只运行一次package singletonimport ( "fmt" "sync" "testing" "unsafe")//go如何完成常见的并发任务 在Go语言中如何实现这样的并发任务//仅仅执行一次 多线程环境下,某段代码,只执行一次//有方 法保证里面的函数在多线程环境下只会被运行一次type Singleton struct {}var singleInstance *Singletonvar onc原创 2021-08-16 19:04:47 · 230 阅读 · 0 评论 -
cancel--任务取消的机制
协程的cancelclose版本context 版本close版本package ch20import ( "fmt" "testing" "time")//任务的取消 使用多路复用和通道关闭的广播机制func isCancelled(cancelChan chan struct{}) bool { select { //收到消息就是被取消了,没收到消息就代表还没被取消 case <- cancelChan: return true default: return原创 2021-08-16 13:22:57 · 460 阅读 · 0 评论 -
多路选择和超时控制
多路选择和超时控制多路选择机制多路选择机制使用select多路选择机制,实现Go中的超时控制//多渠道的选择,从chan上等待消息//每一个case后面跟着一个阻塞事件 运行到select之后后面任意阻塞事件处于非阻塞状态,就会执行case定义的部分 //不能依赖于case所定义的顺序,没有default并且没有事件准备好,会阻塞在select事件上select{case ret := <-retCh1: t.Logf("result %s",ret)case ret := <原创 2021-08-14 16:47:43 · 102 阅读 · 0 评论 -
CSP并发机制
@TOCActor Model与CSP的区别Actor Model,两个实体之间通过发送消息的机制来协调CSP 通过通道完成两个通讯实体之间的协调1.和Actor直接通讯不同,CSP则是通过Channel进行通讯的,更松耦合2.Go中channel是有容量限制并且独立于处理Groutine,Actor模式中的mailbox容量是无限的,接收进程也总是被动地处理消息。比Actor、...原创 2021-08-14 14:11:28 · 355 阅读 · 0 评论 -
Go共享内存并发机制
共享内存并发机制共享内存并发机制竞态条件Lock通道等待组Lock共享内存并发机制竞态条件func TestCounter(t *testing.T){ counter := 0 for i:=0;i<5000;i++{ go func(){ counter++ //counter在不同的协程里面做自增,导致并发竞争条件,非线程安全 }() } time.Sleep(1*time.Second) t.Logf("counter = %d",counter)}L原创 2021-08-03 18:21:06 · 152 阅读 · 0 评论 -
Go协程机制
Go 协程机制Thread vs. GroutineGo基本调度机制Thread vs. Groutine协程是一个更轻量级的线程 1.创建时默认的stack的大小JDK5 以后JAVA Thread stack 默认为1MGroutine的Stack初始化大小为2K 创建起来会更快2.和KSE(Kernel Space Entity)的对应关系JAVA Thread是1:1Groutine是M:NKernel Space Entity 系统线程由CPU直接调度,调度效率高线程切换的原创 2021-07-30 08:11:37 · 277 阅读 · 0 评论 -
Go依赖管理
依赖管理Go未解决的依赖问题vendor路径如何使用glideGo未解决的依赖问题1.同一环境下,不同项目使用同一包的不同版本2.无法管理对包的特定版本的依赖都是按照GoPath/GoRoot 顺序查找vendor路径随着Go 1.5版本得发布,vendor目录被添加到GOPATH/GOROOT之外的依赖目录查找的解决方案,Go 1.6之前需要手动设置环境变量查找依赖包路径的解决方法如下:1.当前包下的vendor目录2.向上级目录查找,直到找到src下的vendor目录3.在GO原创 2021-07-21 10:49:30 · 147 阅读 · 0 评论 -
构建可复用的模块(包)
package1.package是GO基本复用模块单元以首字母大写来表明可被包外代码访问2.代码的package可以和所在目录不一致3.同一目录的Go代码的package要保持一致通过go get来获取远程依赖go get -u 强制从网络更新远程依赖注意代码在GitHub上的组织形式,适应go get直接以代码路径开始,不要有src...原创 2021-07-21 09:41:44 · 177 阅读 · 0 评论 -
错误处理panic和recover
错误处理之panic和recoverpanicrecover代码panic//panic用于不可以恢复的错误//panic退出前会执行defer指定的内容 //defer 延迟执行函数 函数返回前才会执行到defer这个函数 一般用作资源清理/释放锁//os.Exit//os.Exit退出的时候不会调用defer指定的函数//os.Exit退出的时候不输出当前调用栈信息recover//不希望程序在抛出异常后中断或者退出 捕捉异常//panic里面传递的错误,返回给recover原创 2021-07-09 15:51:55 · 307 阅读 · 0 评论 -
Go错误处理机制
错误处理机制错误检测机制使用多返回值处理错误问题定义不同错误变量,方便判断错误类型错误检测机制不喜欢try catch等的判断,认为会降低代码可读性GO支持多返回值,方便错误监测五花八门的写法会降低程序可读性Go提倡快速失败,所以所有错误检测都放到最前面,及早失败,避免嵌套有错误 输出日志,然后return。所有的环节都没有错,才输出最后的结果使用多返回值处理错误问题// 通过第二返回值的true/false来判断是否成功执行//1.没有异常机制//2.error类型实现了erro原创 2021-07-09 10:26:30 · 111 阅读 · 0 评论 -
不一样的接口类型,一样的多态
不一样的接口类型,一样的多态面向对象不同对Go多态的影响空接口和断言GO接口最佳实践面向对象不同对Go多态的影响面向对象的不同 不能影响到GO多态的使用空接口和断言空接口可以表示任何类型通过断言来将空接口转换为制定类型,断言模式就是强制类型转换//v,ok := p.(int) ok=true 转换成功//v 转换后结果值//ok 转换成功的布尔值//自己定义的方法要符合这种编码习惯,使用第一个参数作为返回的数值,第二个是转换的成功与否package empty_interface_原创 2021-07-09 09:35:31 · 108 阅读 · 0 评论 -
GO的拓展与复用
GO的拓展和复用拓展的方法继承拓展的方法通常使用复合和继承GO不支持继承LSP子类交换原则 Go不支持显示类型转换,所以LSP对GO无效只有当子类可以替换掉父类, 软件单位的功能不受到影响时,父类才能真正被复用, 而子类也能够在父类的基础上增加新的行为。GO不支持继承 因为是显示类型转换内嵌不支持访问子类方法和数据 不支持重载继承package extension_testimport ( "fmt" "testing")type Pet struct { //父类P原创 2021-07-08 16:14:29 · 243 阅读 · 0 评论 -
Go语言的相关接口
Go语言相关接口GO接口设计Go 语言的DuckType式接口实现接口变量自定义类型GO接口设计Go的接口设计和很多主流的语言有很大的差别避免的循环依赖的问题方法签名一直即可GO接口的实现 不依赖于Go接口的定义接口为非入侵性,实现不依赖于接口定义接口的定义可以包含在接口的使用者包内Go 语言的DuckType式接口实现package interface_testimport "testing"//先定义一个接口type Programmer interface { Wri原创 2021-07-08 15:31:25 · 112 阅读 · 0 评论 -
Go面向对象
Go面向对象Go行为的定义和实现Go对数据和行为的封装Go行为的定义和实现Go语言的面向对象 Go的面向对象和其他语言有着极大的差别GO语言不支持继承,Go语言接口的实现也使用了自己独特的方式 Go对数据和行为的封装package OOPimport ( "fmt" "testing")/* 面向对象的非常重要的特性是继承,GO中不支持继承 GO语言的接口实用的是和其他语言完全不一样的 面向对象 1.封装数据和行为 封装成员 type Employee stru原创 2021-07-08 11:34:02 · 104 阅读 · 0 评论 -
可变参数和defer
可变长参数和延时运行可变长参数延时运行可变长参数//可变参函数func Sum(ops ...int) int { ret := 0 for _,op := range ops{ ret += op } return ret}func TestVarParam(t *testing.T) { t.Log(Sum(1,2,3,4)) t.Log(Sum(1,2,3,4,5))}延时运行func Clear() { fmt.Println("Clear")}/原创 2021-05-27 09:51:16 · 99 阅读 · 0 评论 -
Golang中的函数编程
Golang中的函数Golang中函数的应用Golang中函数的应用package _funcimport ( "fmt" "math/rand" "testing" "time")func returnMulitiValue()(int,int){ return rand.Intn(10),rand.Intn(20)}//函数开始和结束时候打点,用来计数函数运行的时常func TimeSpent (inner func(op int) int) func(op int) i原创 2021-05-26 10:39:22 · 100 阅读 · 0 评论 -
Go中string类型
String存储与编码遍历StringString的连接和分隔字符串和其他类型的转换存储与编码 //存储与编码 //中 UTF8 0x4E2D // unicode 0xE4B8AD // string/[]byte [0XE4,0xB8,0XAD] //字符串包 strings包 strconv包 //string的空不会是一个0值,而是一个空字符串 //string是数据类型,不是引用或者指针类型 //string是只读的byteslice,len函数原创 2021-04-24 21:37:07 · 451 阅读 · 0 评论 -
Golang中的map
MapMap引起的深拷贝问题使用make避免Map引起的深拷贝问题使用make避免func TestMapInit(t *testing.T) { m := map[string]int{"one":1,"two":2,"three":3} m1 := map[string]int{} m1["one"] = 1 m["one"] = 2 //make 和C++STL中resize一样,为了避免深拷贝导致的性能下降,直接初始化一个大内存 m2 := make(map[string]int原创 2021-04-23 14:27:44 · 139 阅读 · 0 评论 -
数组与切片
数组与切片数组的声明数组的遍历切片 初始化实现切片和可变长切片共享内存的副作用数组和切片的区别数组的声明func TestArrayList(t *testing.T) { //数组的声明 //声明并初始化为默认0值 var a [3]int a[0] = 1 t.Log(a[1],a[2]) //声明同时初始化 b := [3]int{1,2,3} //自动初始化到后面元素个数的长度 c := [...]int{1,2,3,4,5} //多维数组初始化 d := [2][2原创 2021-04-12 15:10:33 · 288 阅读 · 0 评论 -
条件和循环
Go条件与循环条件循环条件func TestIf(t *testing.T){ //if 支持Go语言函数的多返回值 //if两段的写法 if a:=1 == 1; a{ t.Log("1==1") }else { } /* //多返回值,接受错误,判断无错的情况下执行的代码 if v,err := someFun();err == nil{ t.Log("1==1") } */}循环func TestWhileLoop(t *testing.T){ n原创 2021-04-10 13:43:55 · 90 阅读 · 0 评论 -
Go中的运算符
Go中的运算符运算符^&按位清零运算符 package operator_testimport "testing"const( Readable = 1 << iota Writeable Executable)func TestCompareArray(t *testing.T){ //没有前置的++ -- //生产力语言 避免犯错 有很强的约束性 //数组在很多主流语言中,是一个引用类型,不是一个值类型 实际是比较引用,不是值比较 a := [..原创 2021-04-10 12:06:45 · 160 阅读 · 0 评论 -
Go的类型转换/指针/String
Golang类型转换指针String类型转换func TestImplicit(t *testing.T) { var a int32 = 1 var b int64 //使用隐式类型转换会失败 b = int64(a) var c MyInt //别名做隐式类型转换还是会报错,必须使用显示类型转换 //c = b c = MyInt(b) t.Log(a,b,c) //预定于的最大最小值 t.Log(math.MaxInt32-a)}指针func TestPoint原创 2021-04-09 23:35:53 · 1737 阅读 · 0 评论 -
Go测试代码/变量初始化/常量初始化
Go 测试代码/变量/常量初始化测试代码变量赋值(一个语句中对多个变量赋值)Go常量测试代码测试代码package testimport "testing"//编写测试程序/* 1.源码文件以_test结尾: XXX_test.go 2.测试方法名以Test开头: func TestXXX(t *testing.T){......} 2.1大写的方法代表包外可以访问 3.在单元测试程序中,使用t.Log代替fmt.Println*///使用单元测试 体会学习的知识点func T原创 2021-04-09 22:53:46 · 631 阅读 · 0 评论 -
Golang的Hello world
Golang的HelloWorldGolang开端Golang开端1.源码路径使用文件夹src存储2.包使用pkg存储原创 2021-04-07 17:23:06 · 155 阅读 · 1 评论