Ubuntu19.04安装搜狗输入法
Ubuntu19.04安装搜狗输入法安装fcitx123456# 检测是否有fcitx,因为搜狗拼音依赖fcitxfcitx# 安装fcitxsudo apt-get install fcitx-binsudo apt-get install fcitx-table 配置fcitx默认iBus(非常难用),安装完fcixt后在“设置 > 区域和语言 > 管理已安装的语言 > 键盘输入法系统”处把它替换为fcitx,然后重启Ubuntu。 接着选择需要的输入法,点击Ubuntu右上角顶栏的小键盘图标,选择“配置”,把“拼音”调整到最上面,此时已经可以使用拼音输入法。 安装搜狗拼音访问搜狗输入法For Linux,点击立即下载64bit,下载安装文件。 直接双击.deb文件安装,完成后重启Ubuntu。 点击Ubuntu右上角小键盘 > 配置,添加搜狗拼音并调到最上面,就可以使用了。 卸载iBusiBus还是要卸载的,倒不是因为两个输入法同时在右上角,而是因为搜狗输入法的“Shift键切换中英文”没法用。 12sudo apt-get purge ibus...
Ubuntu国内镜像源
Ubuntu国内镜像源备份镜像源1$ sudo cp -v /etc/apt/sources.list /etc/apt/sources.list.backup 替换sources.list中的镜像源ubuntu20 12345678910deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiversedeb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiversedeb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiversedeb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiversedeb https://mirrors.ustc.ed...
github搭建CDN
github搭建CDN 原文:https://baijiahao.baidu.com/s?id=1623013726378332873&wfr=spider&for=pc 新建公开的github仓库,命明为CDN。接着在本地电脑克隆上图仓库。 1git clone https://github.com/wangyangyangisme/CDN.git 复制需要的静态资源到本地CDN仓库中,提交到github仓库上。 123git add .git commit -m "update"git push 注:jsDeliver不支持加载超过20M的资源,所以一些视频最好压缩到20M以下 点击release发布,发布版本号为1.0(自定义),不发布直接写latest 使用方法 123456789101112131415161718192021// load any GitHub release, commit, or branch// note: we recommend using npm for projects that suppo...
golang从context源码领悟接口的设计
golang从context源码领悟接口的设计 go 1.12.7 Context的github地址 转载:https://www.cnblogs.com/li-peng/p/11249478.html go语言中实现一个interface不用像其他语言一样需要显示的声明实现接口。go语言只要实现了某interface的方法就可以做类型转换。go语言没有继承的概念,只有Embedding的概念。想深入学习这些用法,阅读源码是最好的方式.Context的源码非常推荐阅读,从中可以领悟出go语言接口设计的精髓。 对外暴露Context接口Context源码中只对外显露出一个Context接口 123456type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{}}...
Golang工具包
Golang工具包Machinery异步队列https://github.com/RichardKnop/machinery Mqtt通信github.com/eclipse/paho.mqtt.golang 微信开发https://github.com/chanxuehong/wechat fasthttp包github.com/valyala/fasthttp 数据库操作包https://github.com/gocraft/dbr mysql db链式操作https://github.com/gohouse/gorose 文件配置包github.com/spf13/viper cli应用执行程序包github.com/spf13/cobra redis包 命令式操作github.com/garyburd/redigo/redis redis包 便捷操作github.com/go-redis/redis 日志包https://github.com...
golang http(s)转发
golang http(s)转发基于gin123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117package mainimport ( "context" "crypto/tls" "crypto/x509" "fmt" "github.com/gin-gonic/gin" "io/ioutil" "net" "net/http" "net/http/httputil" &q...
go channel使用规则
go channel使用规则range可以在for循环中读取channel 对于信道,其迭代值产生为在该信道上发送的连续值,直到该信道被关闭。若该信道为 nil,则range表达式将永远阻塞 空channel 关闭一个空channel会导致当前goroutine引发panic 向一个空channel发送值会导致当前的goroutine阻塞 从一个空channel接收值也会导致当前的goroutine阻塞 在空channel上的调用len和cap函数都统一返回零。 已关闭的Channel 关闭一个已关闭的channel会引发panic 向一个已关闭的channel发送值会引发panic。当这种send操作处于select块里面的case语句上时,它会随时导致select语句引发panic。 从一个已关闭的channel上接收值既不会阻塞也不能panic,它一直能成功返回。只是返回的第二个值ok永远是false,表示接收到的v是在channel关闭之后拿到的,对应得值也是相应元素类型的零值。可以无限循环从已关闭的channel上接收值。 活跃的Channel 关闭操作 ...
go Main测试
go Main测试我们知道子测试的一个方便之处在于可以让多个测试共享Setup和Tear-down。但这种程度的共享有时并不满足需求,有时希望在整个测试程序做一些全局的setup和Tear-down,这时就需要Main测试了。 所谓Main测试,即声明一个func TestMain(m *testing.M),它是名字比较特殊的测试,参数类型为testing.M指针。如果声明了这样一个函数,当前测试程序将不是直接执行各项测试,而是将测试交给TestMain调度。 示例下面通过一个例子来展示Main测试用法: 1234567// TestMain 用于主动执行各种测试,可以测试前后做setup和tear-down操作func TestMain(m *testing.M) { println("TestMain setup.") retCode := m.Run() // 执行测试,包括单元测试、性能测试和示例测试 println("TestMain tear-down.") os.Exit(retCode)...
go子测试
go 子测试简单的说,子测试提供一种在一个测试函数中执行多个测试的能力,比如原来有TestA、TestB和TestC三个测试函数,每个测试函数执行开始都需要做些相同的初始化工作,那么可以利用子测试将这三个测试合并到一个测试中,这样初始化工作只需要做一次。 除此之外,子测试还提供了诸多便利,下面我们逐一说明。 简单例子我们先看一个简单的例子,以便快速了解子测试的基本用法。 12345678910111213141516171819202122232425262728293031323334353637383940414243package gotest_testimport ( "testing" "gotest")// sub1 为子测试,只做加法测试func sub1(t *testing.T) { var a = 1 var b = 2 var expected = 3 actual := gotest.Add(a, b) if actual != expected { ...
go示例测试
go 示例测试testing 包除了测试,还提供了运行并验证示例的功能。示例,一方面是文档的效果,是关于某个功能的使用例子;另一方面,可以被当做测试运行。 一个示例的例子如下: 1234func ExampleHello() { fmt.Println("Hello") // Output: Hello} 如果 Output: Hello 改为:Output: hello,运行测试会失败,提示: 1234got:Hellowant:hello 一个示例函数以 Example 开头,如果示例函数包含以 “Output” 开头的行注释,在运行测试时,go 会将示例函数的输出和 “Output” 注释中的值做比较,就如上面的例子。 有时候,输出顺序可能不确定,比如循环输出 map 的值,那么可以使用 “Unordered output” 开头的注释。 如果示例函数没有 “Output” 注释,该示例函数只会被编译而不会被运行。 命名约定Go 语言通过大量的命名约定来简化工具的复杂度,规范代码的风格。对示例函数的命名有如下约定: ...
go性能测试
如何编写压力测试压力测试用来检测函数(方法)的性能,和编写单元功能测试的方法类似,此处不再赘述,但需要注意以下几点: 压力测试用例必须遵循如下格式,其中XXX可以是任意字母数字的组合,但是首字母不能是小写字母 go test不会默认执行压力测试的函数,如果要执行压力测试需要带上参数-bench,语法: -bench="test_name_regex",例如go test -bench=".*"表示测试全部的压力测试函数 在压力测试用例中,请记得在循环体内使用testing.B.N,以使测试可以正常的运行 文件名也必须以_test.go结尾 下面我们新建一个压力测试文件webbench_test.go,代码如下所示: 123456789101112131415161718192021package mainimport ( "testing")func Benchmark_Division(b *testing.B) { for i := 0; i < b.N; i++ { //u...
Golang新手可能会踩的50个坑
Golang 新手可能会踩的 50 个坑译文:Golang 新手可能会踩的 50 个坑原文:50 Shades of Go: Traps, Gotchas, and Common Mistakes翻译已获作者授权,转载请注明来源。 不久前发现在知乎这篇质量很高的文章,打算加上自己的理解翻译一遍。文章分为三部分:初级篇 1-34,中级篇 35-50,高级篇 51-57 前言Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷。如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到。 如果花时间学习官方 doc、wiki、讨论邮件列表、 Rob Pike 的大量文章以及 Go 的源码,会发现这篇文章中的坑是很常见的,新手跳过这些坑,能减少大量调试代码的时间。 初级篇:1-341. 左大括号 { 不能单独放一行在其他大多数语言中,{ 的位置你自行决定。Go 比较特别,遵守分号注入规则(automatic semicolon injection):编译器会在每行代码尾部特定分隔符后加 ; 来分隔多条语句,...
go设计模式
go设计模式go版本的设计模式 本来想写python版本的设计模式,但是发现网上很多。 而go版本的设计模式相对较少。就决定写go版本的设计模式 设计模式按性质分为三类 创建型 1、工厂模式 定义一个用于创建对象的接口, 让子类决定实例化哪个类 工厂方法使一个类的实例化延迟到其子类 2、抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口, 而无需指定他们具体的类 优点: 易于交换产品, 具体工厂配置不同的产品 优点: 让具体的创建实例过程与客户端分离, 客户端是通过它们的抽象接口操纵实例, 产品的具体类名也被具体工厂的实现分离, 不会出现在客户端的代码中 3、建造者模式 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示 用户只需指定需要建造的类型, 不需要知道具体地建造过程和细节 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式 可替换性 4、单例模式 保证一个类仅有一个实例, 并提供一个访问他的全局访问点 确保任何情况下绝对只有一个实例 坑: 多进程, 要考虑加锁 web时, 往往是多进程起 web时...
Go单元测试
Go单元测试编写测试源码使用go的测试框架需要遵循一定的规则,运行 go test 命令将执行当前目录下的包的测试代码,它会寻找 *_test.go 文件,并在这些文件中,寻找符合 TestXxx(*testing.T){} 命名的函数和参数(即,接收 *testing.T 参数的函数,命名为 TestXxx,Xxx 可以是任何不以小写字符开头的名字)。这个测试代码不会影响正常的编译过程,只在执行 go test 时被使用。 源文件 1234567// gomod.gopackage gomodimport "fmt"func Say() { fmt.Println("hello everybody!")} 测试文件 1234567// gomod_test.gopackage gomodimport "testing"func TestGomod(t *testing.T) { Test()} 运行测试代码 go test 12this is a te...
Go mod依赖管理工具
Go mod依赖管理工具Go mod命令用法: 12go mod <command> [arguments] command: 123456789download 将依赖库下载到本地缓存edit 编辑go.modgraph 打印模块依赖图init 再当前文件夹下初始化一个新的module, 创建go.mod文件tidy 整理添加缺失并删除未使用的模块vendor 将依赖复制到vendor下verify 校验依赖why 解释为什么需要依赖 1.go mod download [-json] [modules] 可以下载所需要的依赖,但是依赖并不是下载到GOPATH中,而是GOPATH/pkg/mod中,多个项目可以共享缓存的module。 2.go mod edit [editing flags] [go.mod] -fmt 重新格式化go.mod文件而不进行其他更改。如'go mod edit -fmt'。 -module 更改模块的路径(go.mod文件的模块行)。 -re...
Go语言调用动态库
Go语言调用动态库 golang的OLE调用工具包 https://github.com/mattn/go-ole GCC环境https://sourceforge.net/projects/mingw-w64/files/ 设置环境变量后在控制台中输入 1gcc -v 可以看到gcc版本号,说明gcc安装成功 编写go程序我们这里只是编写一个简单的输出字符串的程序,接受一个字符串参数,然后将拼接成新的字符串并作为返回值返回,在这里,我们将文件命名为libhello.go 12345678910package mainimport "C"func hello(msg string) string { return "Hello! " + msg}func main() {} 注意,即使是要编译成动态库,也要有main函数,上面的import "C"一定要有 Windows动态库执行如下命令生成DLL动态链接库: 1go build -buildmode=c-share...
go语言template包中模板语法总结
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012...
go设置多个GOPATH
go设置多个GOPATHlinux: 1GOPATH="/home/www/gopath1:/home/www/gopath2" windows: 1GOPATH=f:/gopath1;f:/gopath2; 注意:go get 时默认安装到第一个GOPATH路径 go build时,有时会报同一种类型或方法不匹配,由于多个是GOPATH路径顺序不对导致的,调换一下顺序即可解决
GO类型转换及与C的类型转换
GO类型转换及与C的类型转换类型转换语法 1dst := float32(src) 示例 123var num int = 520f32 := float32(num)i64 := int64(num) 注意:加入 val 是一个指针, int32(val) 相当于*(int32(var1)) ,指针不能直接转换成一个int32类型,应该改为 (*int32)(var1) ,所以某些类型可能引起误会的应该用括号括起来转换。 类型断言语法 12dst,ok := src.(int) // 安全类型断言,通过ok判断是否转换成功dst := src.(int) // 非安全类型断言,无法确定是否转换成功 示例 12345678var val interface{} = 123num,ok := val.(int)if ok { fmt.Printf("%T->%d\n", num, num)} else { fmt.Println("类型不匹配")} 其他转换g...
go程序中加载go编写的插件
golang版本: 1.5 以上支持动态库,1.8以上支持plugin go提供的plugin包可以实现热更新的功能。 Go插件是使用-buildmode = plugin标记编译的一个包,用于生成一个共享对象(.so)库文件。 Go包中的导出的函数和变量被公开为ELF符号,可以使用plugin包在运行时查找并绑定ELF符号。 Go编译器能够使用build flag -buildmode = c-shared创建C风格的动态共享库。 从1.8版开始,Go插件功能只能在Linux上使用。 很有可能在将来的版本中发生变化。 pluginPlugintype Plugin即Golang加载的插件,与之有关的两个方法: Open: 根据参数path提供的插件路径加载这个插件,并返回插件这个插件结构的指针*Glugin Lookup: *Plugin的惟一方法,通过名称symName在插件中寻找对应的变量或方法,以Symbol的形式返回 Symbol根据定义type Symbol interface{},Symbol是interface的别名,也就是说,我们可以从插件里面拿到任何...