golang
文章平均质量分 60
文艺青年o好像不是我
这个作者很懒,什么都没留下…
展开
-
部署go环境
1、go环境变量 GOROOT go在电脑中的安装位置 GOPATH go项目存放目录 GOBIN go编译的安装位置,默认为$GOROOT/bin 2、安装go mac 直接下载go的安装包下载地址,1.11进行安装 安装完成后,在终端验证是否安装成功. $~ go version go version go1.11 darwin/amd64 为了保证相关文件系统在任何位置都能使用,你还...原创 2018-11-01 16:10:45 · 158 阅读 · 0 评论 -
go数组与切片
数组 数组是具有相同唯一类型的一组长度固定的数据项序列,这种类型可以是任意的原始类型,例如整形,字符型或者自定义类型。数组长度必须是一个常量的表达式,并且是一个非负整数。 数组元素可以用个索引累读取,数组长度最大为2Gb。声明格式为: var identifier [len]type 例如: var arr1 [5]int 每个元素是一个整型值,数组在声明时所有的元素都会被自动初始化为0. 由...原创 2018-11-05 21:27:38 · 135 阅读 · 0 评论 -
go流程控制
1.if-else 用于测试条件是否成立,成立则执行if括起来的代码: if condition { //do something } 如果需要在条件不满足时执行,则只需要加上else即可: if condition { //do something } else { //do simething } 如果存在多个条件,可以使用else-if增加新的判断: if con...原创 2018-11-05 14:34:19 · 124 阅读 · 0 评论 -
go结构体(struct)和方法(method)
结构体(struct) go中没有对象这一概念,所以采用了结构体的概念,结构体在go中有着非常重要的位置。结构体是值类型,所以可以使用new函数来创建。结构体中字段必须唯一。 结构体定义如下: type identifier struct { filed type filed type } filed就是结构体的字段名字,type是字段的类型,如果暂时不知道命名,可以使用 _ 来...原创 2018-11-07 15:10:31 · 2492 阅读 · 0 评论 -
go中的string和strconv包
go为string提供了strings包来进行字符串的主要操作。 HasPrefix判断字符串是否已prefix开头: strings.HasPrefix(s, prefix string) bool HasSuffix判断字符串是否已suffix结尾: strings.HasSuffix(s, suffix string) bool 简单的例子: package main import (...原创 2018-11-04 19:11:21 · 177 阅读 · 0 评论 -
go配置文件读取
一个强大简单好用的配置解决方案,Viper Viper具有以下特性: 设置默认值 可以读取如下格式的配置文件:JSON、TOML、YAML、HCL 监控配置文件改动,并热加载配置文件 从环境变量读取配置 从远程配置中心读取配置(etcd/consul),并监控变动 从命令行 flag 读取配置 从缓存中读取配置 支持直接设置配置项的值 Viper的读取顺序: viper.Set() 所设置的...原创 2018-11-02 16:49:33 · 456 阅读 · 0 评论 -
go开发属于自己的日志库-文件日志库原型实现
上一篇中已经讲述了日志库的需求,这一篇中我们来实现日志库的原型。 新建一个项目,这里我用的hm_log,在项目下新建一个log_interface.go日志规范,定义日志级别的方法: package hm_log type Log interface { Debug(format string, args ...interface{}) // ...表示接收可变参数 Trace(format...原创 2018-11-09 14:34:53 · 288 阅读 · 0 评论 -
go开发属于自己的日志库-日志库需求分析
go的第三方框架中已经有很多日志库了,为什么还要自己写一遍。俗话说,好记性不如烂笔头,更何况是编程语言呢。多写多练才能使自己技术进步。 一般来说,日志库支持文件写入和console显示,还有的支持写入在网络服务中,这次的日志库,只需要实现文件写入和console就可以了。 1、首先我们需要定义日志的打印级别: Debug: 调试程序,日志最详细。但是会影响程序的性能。 Trace: 追踪问题。 ...原创 2018-11-09 14:34:21 · 277 阅读 · 0 评论 -
go开发属于自己的日志库-日志切分
在文件日志中,还存在一个问题,就是在日志写文件时间长了以后,日志文件肯定会非常大,内容非常多,这个时候如果我们需要去定位一个错误,会耗费很长的时间。所以我们需要将日志文件进行分割,分割文件我们可以采用一天分割一次,或者文件大小达到一个体积进行分割。 log_const.go const ( LogSplitTypeHour = iota LogSplitTypeSize ) file.go ...原创 2018-11-09 14:37:41 · 1355 阅读 · 0 评论 -
go开发属于自己的日志库-日志库优化
日志库基本上写完了,但是就完成了,还没有。目前来说,我们的文件写日志的方式采用同步方式,如果在大量日志写入的时候,同步写入的缺陷就暴露出来了。而且日志跟我们的业务逻辑也没有什么太大的关系,哪怕掉了几条也没什么影响,所以这里可以将同步写改为异步写。 这里采用go的channel进行异步写日志。 在业务调用写日志时,将日志数据写入channel中 起一个后台线程不断的从channel中取日志,然...原创 2018-11-09 14:37:07 · 418 阅读 · 0 评论 -
go开发属于自己的日志库-日志库易用性封装
文件日志和console日志也完成了,我们试试在其他其他使用一下。在我们之前的server中,main.go输入一下代码: package main import "hm_log" var log hm_log.Log func initLog(logPath, logName string) { //log := hm_log.NewFileLog(logPath, logName...原创 2018-11-09 14:36:26 · 243 阅读 · 0 评论 -
go开发属于自己的日志库-控制台日志实现
上一篇中我们将文件日志库基本实现了,我们现在再讲console日志库实现,那我们的日志库也基本就可以完成了。 新建console.go,把我们console日志库也实现了。因为console日志库只是将日志输出到终端里面。 package hm_log import ( "fmt" "os" ) type ConsoleLog struct{} func NewConsoleLog() ...原创 2018-11-09 14:35:58 · 604 阅读 · 0 评论 -
go开发属于自己的日志库-文件日志库实现
上一篇中我们已经把日志写入文件中了,但是还有一些问题,可以看到我们日志内容没有记录时间,也没有日志级别。错误日志,没有错误的文件和行号,也不知道在哪个函数出错的,这些我们也是需要加入进去的。 所以,我们的日志打印的内容应该是这样的: 2018-11-08 18:18:18.888 DEBUG [logDebug.go/logDebug.Debug:20] this is a debug log ...原创 2018-11-09 14:35:31 · 622 阅读 · 1 评论 -
go的Map
map是一种键值对数据结构,一个key键对应一个value值。map在其他有些编程语言中称为字典。 map是引用类型,声明方式为以下: var map1 map[key]value var map1 map[string]int map在声明的时候不需要声明长度,map是可以动态增长的。未初始化的map值为nil。key可以是任意使用 == 或者 != 操作符比较的类型,比如说string,in...原创 2018-11-06 10:29:33 · 157 阅读 · 0 评论 -
go字符串
字符串是一种值类型,并且值是不可变的。 go支持一下2中形式: 转义字符串: 这类字符串会被相应的规则进行替换 \n 换行符 \r 回车 \t tab键 \ \自身 非转义字符串 这类字符串会原样输出:`This is string \n` 输出字符为 This is string \n string类型的零值为长度为零空字符串""。 string可以通过索引来进行获取字节 var s...原创 2018-11-01 16:25:17 · 123 阅读 · 0 评论 -
go基本类型和运算符
bool 一个简单的列子: var a bool = ture bool值只有false和true。两个相同的类型之间可以通过 == 或者 != 来比较获取一个bool值。 比如: var a = 1 a == 5 //false a == 1 //true a != 2 //true a != 1 //false go对于值之间的比较非常严格,只有两个相同的类型的值才可以进行比较。如果其中一...原创 2018-11-01 16:12:01 · 158 阅读 · 0 评论 -
go常量与变量
常量 常量使用关键字const,常量的数据类型只能是数字型(整数,浮点和复数)、字符串型和布尔型。 格式:const name type = value 比如: const a = 1 在go语言中,可以省略类型,因为编译器可以根据常量的值来推断类型。 常量在赋值时,可以使用运算符,比如: const b = 1/2 但是最好不要使用自定义函数,因为自定义函数在编译期间并不知道能否获取返回的值...原创 2018-11-01 16:11:17 · 108 阅读 · 0 评论 -
go-IO操作(一)
格式化输入输出 从终端获取用户的输入,go提供了三个函数: //格式化输入,空格作为分隔符,占位符和格式化输出一致 fmt.Scanf(format string, a ...interface{}) //从终端获取用户输入,存储在Scan的参数里,空格和换行符作为分隔符 fmt.Scan(a ...interface{}) //从终端获取用户输入,存储在Scanln的参数里,空格作为分隔符,遇...原创 2018-11-15 14:19:10 · 704 阅读 · 0 评论