一、GO基本概念
Go是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go是从2007年末由Robert Griesemer (罗伯特.格利茨默),Rob Pike(罗伯.派克),>
- Ken Thompson(肯.汤普森)主持开发,后来还加入了lan Lance Taylor(伊恩:兰斯·>泰勒), Russ Cox(鲁斯.考斯)等人,并最终于2009年11月开源,在2012年早些时>候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的>社区。
- Rob Pike:曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8 字元编码。
- Robert Griesemer:在开发Go之前是Google V8、Chubby和HotSpot JVM的主要
贡献者,曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。
二、GO语言的特点
兼顾C语言级别的编译、运行效率,容易部署,PHP级别的开发效率
- 强大的标准库,内置高效的垃圾回收机制
- 简单的并发编程,goroutine和channel极易上手
- 静态类型语言,拥有强大的编译检查、严格的编码规范
- 背景强大,由三位骨灰级大师创造,google公司运营维护
三、GO语言前景
在云计算、微服务、基础后端软件上具有强大优势
得到诸多大厂的"青睐",很多部门由java转golang,新公司甚至直接使用golang
优秀开源项目不断涌现,有docker和k8s
四、GO环境部署
1、安装go
官方下载网址:golang.google.cn
2、配置环境变量
3、环境变量设置完成之后查看
go version
五、go 语法操作
1、//将整形转成字符串
strconv.Itoa()
//字符串转int 类型
strconv.Atoi()
2、截取参数
//通过下标找到位置截取
tracer := "死神来了, 死神bye bye"
comma := strings.Index(tracer, ", ")
pos := strings.Index(tracer[comma:], "死神")
fmt.Println(comma, pos, tracer[comma+pos:])
输出:
3 死神bye bye
3、//时间格式处理
//当前时间
now := time.Now( )
fmt.PrintIn(now)
//时间戳,单位秒
seconds stamp := now.Unix(fmt.PrintIn( seconds stamp)
//时间戳,单位纳秒 1秒=le3毫秒=le9纳秒fmt.PrintIn(now.UnixNano( ))
//时间戳,单位毫秒
fmt.PrintIn(now.UnixNano( ) / le6)//只输出年,其他字段类似
fmt.Printin(now.Year( ))
//只输出月
fmt.PrintIn(now.Month( ))
//只输出天
fmt.PrintIn(now.Day( ))
//只输小时
fmt.PrintIn(now.Hour( ))
//一年的第几天
fmt.PrintIn(now.YearDay( ))
[/年月日
fmt.PrintIn(now.Date( ))
//时分秒
fmt.PrintIn(now.Clock( ))
//时间转时间戳,单位秒
seconds stamp := now.Unix()
//时间转字符串,时间格式化,模板为2006-01-02 15:04:05,区别为java中yyyy-MM-dd HH:mm:ss//解析在方法time.format.nextStdChunk(),用上符号表示年月日等,是因为各字段是互斥的,具体可以看源码fmt.Printin(now.Format("2006-01-02 15:04:05")) //2019-07-17 18:43:16
//时间戳转时间
fmt.Println( time.Unix( seconds_stamp, 0 ))
/字符串转时间
fmt.Println(time.Parse("2006-01-02 15:04:05","2019-07-01 08:18:18"))
//自定义时间段timeDur := time.Duration(10)*time.Second + time.Duration(1)*time.Minutefmt.PrintIn(timeDur)
//时间相加nowAddTime := now.Add( timeDur )fmt.PrintIn(nowAddTime )
//时间相减,时间差(时间段)
diff := nowAddTime.Sub( now)
fmt.Println(diff) //1m10s
fmt.Println(diff.Hours( )) //分为单位显示时间差,0.019444444444444445fmt.Println(diff.Minutes()) //分为单位显示时间差、1.1666666666666667fmt.Println(diff.Seconds( )) //秒为单位显示时间差,70
//年月日添加
fmt.Println(nowAddTime.AddDate(1,-9,3)) //2019-10-20 18:55:56.654503204 +0800 CS
timeDur := time.Duration(10)xtime.Second + time.Duration(1)*time.MinutenowAddTime := now.Add( timeDur )
//时间比较
//时间之前比较
fmt.PrintIn(nowAddTime.After(now)) //true
//时间之后比较
fmt.PrintIn(nowAddTime.Before(now)) //false
//时间相等比较
fmt.Printin(now.Equal(now)) //true
//休眠1秒
time.Sleep(time.Second*1)
六、go中validate中的验证规则
required //这将验证该值不是数据类型的默认零值。数字不为0,字符串不为 " ", slices, maps, pointers, interfaces, channels and functions 不为 nil
isdefault //这验证了该值是默认值,几乎与所需值相反。
len=10 //对于数字,长度将确保该值等于给定的参数。对于字符串,它会检查字符串长度是否与字符数完全相同。对于切片,数组和map,验证元素个数。
max=10 //对于数字,max将确保该值小于或等于给定的参数。对于字符串,它会检查字符串长度是否最多为该字符数。对于切片,数组和map,验证元素个数。
min=10
eq=10 //对于字符串和数字,eq将确保该值等于给定的参数。对于切片,数组和map,验证元素个数。
ne=10 //和eq相反
oneof=red green (oneof=5 7 9) //对于字符串,整数和uint,oneof将确保该值是参数中的值之一。参数应该是由空格分隔的值列表。值可以是字符串或数字。
gt=10 //对于数字,这将确保该值大于给定的参数。对于字符串,它会检查字符串长度是否大于该字符数。对于切片,数组和map,它会验证元素个数。
gt //对于time.Time确保时间值大于time.Now.UTC()
gte=10 //大于等于
gte //对于time.Time确保时间值大于或等于time.Now.UTC()
lt=10 //小于
lt //对于time.Time确保时间值小于time.Now.UTC()
lte=10 //小于等于
lte //对于time.Time确保时间值小于等于time.Now.UTC()
----
unique //对于数组和切片,unique将确保没有重复项。对于map,unique将确保没有重复值。
alpha //这将验证字符串值是否仅包含ASCII字母字符
alphanum //这将验证字符串值是否仅包含ASCII字母数字字符
alphaunicode //这将验证字符串值是否仅包含unicode字符
alphanumunicode //这将验证字符串值是否仅包含unicode字母数字字符
numeric //这将验证字符串值是否包含基本数值。基本排除指数等...对于整数或浮点数,它返回true。
hexadecimal //这将验证字符串值是否包含有效的十六进制
hexcolor //这验证字符串值包含有效的十六进制颜色,包括#标签(#)
rgb //这将验证字符串值是否包含有效的rgb颜色
rgba //这将验证字符串值是否包含有效的rgba颜色
hsl //这将验证字符串值是否包含有效的hsl颜色
hsla //这将验证字符串值是否包含有效的hsla颜色
email //这验证字符串值包含有效的电子邮件这可能不符合任何rfc标准的所有可能性,但任何电子邮件提供商都不接受所有可能性
file //这将验证字符串值是否包含有效的文件路径,并且该文件存在于计算机上。这是使用os.Stat完成的,它是一个独立于平台的函数。
url //这会验证字符串值是否包含有效的url这将接受golang请求uri接受的任何url,但必须包含一个模式,例如http://或rtmp://
uri //这验证了字符串值包含有效的uri。这将接受uri接受的golang请求的任何uri
base64 //这将验证字符串值是否包含有效的base64值。虽然空字符串是有效的base64,但这会将空字符串报告为错误,如果您希望接受空字符串作为有效字符,则可以将此字符串与omitempty标记一起使用。
base64url //这会根据RFC4648规范验证字符串值是否包含有效的base64 URL安全值。尽管空字符串是有效的base64 URL安全值,但这会将空字符串报告为错误,如果您希望接受空字符串作为有效字符,则可以将此字符串与omitempty标记一起使用。
btc_addr //这将验证字符串值是否包含有效的比特币地址。检查字符串的格式以确保它匹配P2PKH,P2SH三种格式之一并执行校验和验证
btc_addr_bech32 //这验证了字符串值包含bip-0173定义的有效比特币Bech32地址(https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki)特别感谢Pieter Wuille提供的参考实现。
eth_addr //这将验证字符串值是否包含有效的以太坊地址。检查字符串的格式以确保它符合标准的以太坊地址格式完全验证被https://github.com/golang/crypto/pull/28阻止
contains=@ //这将验证字符串值是否包含子字符串值
containsany=!@#? //这将验证字符串值是否包含子字符串值中的任何Unicode code points。
containsrune=@ //这将验证字符串值是否包含提供的符文值。
excludes=@ //这验证字符串值不包含子字符串值。
excludesall=!@#? //这将验证字符串值在子字符串值中是否包含任何Unicode code points。
六、以下是几个Go语言的开源框架:
Beego:一个开源的、高性能的Web框架。
Buffalo:快速Web开发框架。
Echo:高性能、极简的Web框架。
Gin:HTTP Web框架,提供Martini风格的API但具有更好的性能。
Iris:发展最快的Go Web框架,提供完整的MVC功能并面向未来。
Revel:一个高生产率的全栈Go语言Web框架。