os.args模块和time,md5以及base和log模块
9.os.args模块
os.args是在os模块中,我们可以简单打印os.args,而后传递 一些参数
package main
import (
"os"
"fmt"
)
func main(){
fmt.Println(os.Args)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run args.go www.linuxea.com
[/tmp/go-build909504842/b001/exe/args www.linuxea.com]
打印的结果是,文件的目录和传入的参数
也可以进行build
[root@linuxea.com /opt/Golang/work4/stdpkg]# go build args.go
[root@linuxea.com /opt/Golang/work4/stdpkg]# chmod +x args
如下:
[root@linuxea.com /opt/Golang/work4/stdpkg]# ./args www.linuxea.com
[./args www.linuxea.com]
命令后传递参数可以看flag
10.flag模块绑定变量
- 示例
我们定义一个flag的参数传递
首先定义个变量
var port int
而后使用flag.IntVar()
绑定命令行参数,这里需要传递指针,参数,默认值,备注。如下:
- 参数
-P
- 默认值88
- 备注
nginx port
flag.IntVar(&port,"P",88,"nginx port")
解析命令行参数
flag.Parse()
而后打印
fmt.Println(port)
在如法炮制一个host的string和verbor的布尔类型参数,如下
package main
import (
"flag"
"fmt"
)
func main(){
var port int
var host string
var verbor bool
flag.IntVar(&port,"P",88,"nginx port")
flag.StringVar(&host,"H","127.0.0.1","-host addr")
flag.BoolVar(&verbor,"v",false,"detail log")
flag.Parse()
fmt.Println(host,port,verbor)
}
运行默认的参数就是127.0.0.1 88
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -P 66 -H 10.0.0.96
10.0.0.96 66 false
我们可以传递参数,-P
和-H
,-P
是int类型,-H
是string类型,-V
是bool类型,如果输入错误就会报错,并且打出使用信息
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -P st -H 10.0.0.96 -v
invalid value "st" for flag -P: parse error
Usage of /tmp/go-build440964329/b001/exe/flag:
-H string
-host addr (default "127.0.0.1")
-P int
nginx port (default 88)
-v detail log
exit status 2
使用-P
和-H
传递参数,如果不加-v
默认就是false
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -P 66 -H 10.0.0.96
10.0.0.96 66 false
加上-V
就变成了true
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -P 66 -H 10.0.0.96 -v
10.0.0.96 66 true
10.1--help
利用boolvar编写help帮助
声明一个Boolvar的help变量
var help bool
flag.BoolVar(&help,"help",false,"help")
func main(){
var port int
var host string
var verbor bool
var help bool
flag.IntVar(&port,"P",88,"nginx port")
flag.StringVar(&host,"H","127.0.0.1","-host addr")
flag.BoolVar(&verbor,"v",false,"detail log")
flag.BoolVar(&help,"help",false,"help")
flag.Parse()
fmt.Println(host,port,verbor)
}
而后判断help如果为true就打印帮助信息,这里调用flag.Usage()
。
if help{
flag.Usage()
}else {
fmt.Println(host,port,verbor)
}
运行
加上-h
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -h
Usage of /tmp/go-build717929224/b001/exe/flag:
-H string
-host addr (default "127.0.0.1")
-P int
nginx port (default 88)
-help
help
-v detail log
exit status 2
而这个flag.Usage()
可以改写
10.2flag.Usag
flag.Usage()
flag.Usage()
是一个无参的函数,我们进行重新赋值
flag.Usage = func(){
fmt.Println("Usage flagargs:n -H --host 127.0.0.1n -P --port 80n -V")
}
而后在调用,就发现已经被改写了
package main
import (
"flag"
"fmt"
)
func main(){
var port int
var host string
var verbor bool
var help bool
flag.IntVar(&port,"P",88,"nginx port")
flag.StringVar(&host,"H","127.0.0.1","-host addr")
flag.BoolVar(&verbor,"v",false,"detail log")
flag.BoolVar(&help,"help",false,"help")
flag.Usage = func(){
fmt.Println("Usage flagargs:n -H --host 127.0.0.1n -P --port 80n -V")
}
flag.Parse()
if help{
flag.Usage()
}else {
fmt.Println(host,port,verbor)
}
}
运行,使用-H
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -h
Usage flagargs:
-H --host 127.0.0.1
-P --port 80
-V
exit status 2
或者我们在加一个参数,使用flag.PrintlnDefaults()
10.3flag.PrintDefault
flag.PrintDefault
在原来的基础上,加上flag.PrintDefaults()
flag.Usage = func(){
fmt.Println("Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ]")
flag.PrintDefaults()
}
代码块
[root@linuxea.com /opt/Golang/work4/stdpkg]# cat flag.go
package main
import (
"flag"
"fmt"
)
func main(){
var port int
var host string
var verbor bool
var help bool
flag.IntVar(&port,"P",88,"nginx port")
flag.StringVar(&host,"H","127.0.0.1","-host addr")
flag.BoolVar(&verbor,"v",false,"detail log")
flag.BoolVar(&help,"help",false,"help")
flag.Usage = func(){
fmt.Println("Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ]")
flag.PrintDefaults()
}
flag.Parse()
if help{
flag.Usage()
}else {
fmt.Println(host,port,verbor)
}
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -h
Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ]
-H string
-host addr (default "127.0.0.1")
-P int
nginx port (default 88)
-help
help
-v detail log
exit status 2
那么,现在看到的就是自己的定义的格式。
10.4flag.args
flag.args
现在,假如还要传递一些没有名称的flag,就是可以使用flag.args
在原有的代码上加上flag.args
if help{
flag.Usage()
}else {
fmt.Println(host,port,verbor)
fmt.Println(flag.Args())
}
我们添加一个Usage的信息[args01 args02]
并且在条件处理中也添加
flag.Usage = func(){
fmt.Println("Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ] [args01 args02]")
flag.PrintDefaults()
}
代码块
package main
import (
"flag"
"fmt"
)
func main(){
var port int
var host string
var verbor bool
var help bool
flag.IntVar(&port,"P",88,"nginx port")
flag.StringVar(&host,"H","127.0.0.1","-host addr")
flag.BoolVar(&verbor,"v",false,"detail log")
flag.BoolVar(&help,"help",false,"help")
flag.Usage = func(){
fmt.Println("Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ] [args01 args02]")
flag.PrintDefaults()
}
flag.Parse()
if help{
flag.Usage()
}else {
fmt.Println(host,port,verbor)
fmt.Println(flag.Args())
}
}
假如不传递任何参数,就是空的[]
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go
127.0.0.1 88 false
[]
传入参数
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go mark linuxea.com
127.0.0.1 88 false
[mark linuxea.com]
并且使用-H可以看到在Usage中添加的信息。
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flag.go -H
flag needs an argument: -H
Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ] [args01 args02]
-H string
-host addr (default "127.0.0.1")
-P int
nginx port (default 88)
-help
help
-v detail log
exit status 2
10.5
我们换一种方式,赋值给每个flag,然后使用指针调用,如下:
package main
import (
"flag"
"fmt"
)
func main(){
port := flag.Int("P",88,"nginx port")
host := flag.String("H","127.0.0.1","-host addr")
verbor := flag.Bool("v",false,"detail log")
help := flag.Bool("help",false,"help")
flag.Usage = func(){
fmt.Println("Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ] [args01 args02]")
flag.PrintDefaults()
}
flag.Parse()
fmt.Printf("%T %T %T %Tn",*port,*host,*verbor,*help)
fmt.Printf("%v %v %v %vn",*port,*host,*verbor,*help)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flags.go
int string bool bool
88 127.0.0.1 false false
-v
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flags.go -v
int string bool bool
88 127.0.0.1 true false
-H
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run flags.go -H
flag needs an argument: -H
Usage flagargs: [ -H --host 127.0.0.1 -P --port 80 -V ] [args01 args02]
-H string
-host addr (default "127.0.0.1")
-P int
nginx port (default 88)
-help
help
-v detail log
exit status 2
11.time模块
导入time模块,time的类型也是time.Time
。我们使用time.Now()
获取当前时间
- 示例代码
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
fmt.Printf("%Tn",now)
fmt.Printf("%v",now)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time.go
time.Time
2019-10-02 21:29:02.017017987 +0800 CST m=+0.000473262
时间类型
- 秒 time.Second
- 分钟 time.Minute
- 小时 time.Hour
11.1时间转换
最基础的方式是将时间转换成字符串
一般来讲有这样几种方式
2000/01/01 08:01:01
或者
2000-01-01 08:01:01
在go中,2006表示年,01表示月,02表示天,小时24进制使用15,分钟使用04表示,秒使用05表示
那么现在使用now.Format()
来转换时间,如下
func main(){
now := time.Now()
fmt.Printf("%Tn",now)
fmt.Printf("%vn",now)
fmt.Println(now.Format("2006-01-02 15:04:05"))
fmt.Println(now.Format("2006/01/02 15:04:05"))
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time.go
time.Time
2019-10-02 21:48:34.622411579 +0800 CST m=+0.000180147
2019-10-02 21:48:34
2019/10/02 21:48:34
- 年月日/时分秒
假如此刻只需要年月日, now.Format("2006/01/02")
即可,如果只是时分秒now.Format("15:04:05")
即可
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
fmt.Println(now.Format("2006/01/02"))
fmt.Println(now.Format("15:04:05"))
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time.go
time.Time
2019/10/02
21:50:18
-
转换unix时间戳
now.Unix()
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
fmt.Println(now.Unix())
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time.go
1570065936
-
纳秒
now.UnixNano()
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
fmt.Println(now.UnixNano())
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time.go
1570066422096765619
11.2转换时间
- 将字符串转换成时间
time.Parse
time.Parse
又两个返回值,一个是err,一个是转换的值
转换的格式必须一样
- 示例
我们定义一个时间格式,假如现在是2015/08/06 06:00:00
,如下
now := "2015/08/06 06:00:00"
而后使用time.Parse
进行转换,在time.Parse("2006/01/02 15:04:05“)
中的第一段时间是模板,第二段的时间是转换的时间。比如现在将now变量的2015/08/06 06:00:00
按照2006/01/02 15:04:05
格式转换成字符串。如下:
这里使用t和err进行接收返回值
t,err := time.Parse("2006/01/02 15:04:05",now)
而后打印
fmt.Println(err,t)
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time2.go
<nil> 2015-08-06 06:00:00 +0000 UTC
- 将unix时间戳转换时间
示例:
at := time.Unix(0,0)
fmt.Println(at)
代码块
package main
import (
"fmt"
"time"
)
func main(){
at := time.Unix(0,0)
fmt.Println(at)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time2.go
1970-01-01 08:00:00 +0800 CST
11.3计算时间区间
需要两个time类型的时间进行计算时间区间,于是我们就定义两个时间点,分别是now和date,date的时间需要通过字符串转换
now := time.Now()
date := "2019/10/02 00:00:00"
t,err := time.Parse("2006/01/02 15:04:05",date)
然后通过now.Sum计算当前时间和date的时间差。并且打印出类型
d := now.Sub(t)
fmt.Println(d)
fmt.Printf("%T",d)
代码块
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
date := "2019/10/02 00:00:00"
t,err := time.Parse("2006/01/02 15:04:05",date)
fmt.Println(t,err)
d := now.Sub(t)
fmt.Println(d)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time3.go
2019-10-02 00:00:00 +0000 UTC <nil>
26h23m59.68928344s
time.Duration
当前时间与date时间差了26h23m59.68928344s
,时间区间的类型是time.Duration
### 11.4休眠时间
time.Sleep
需要设置一个时间区间,比如,休眠三秒
fmt.Println(time.Now())
time.Sleep(time.Second * 3)
fmt.Println(time.Now())
代码块
package main
import (
"fmt"
"time"
)
func main(){
fmt.Println(time.Now())
time.Sleep(time.Second * 3)
fmt.Println(time.Now())
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time4.go
2019-10-03 10:35:32.848757428 +0800 CST m=+0.000131262
2019-10-03 10:35:35.849273679 +0800 CST m=+3.000647522
11.5添加时间区间
我们给当前的时间加上几个小时后打印
package main
import (
"fmt"
"time"
)
func main(){
fmt.Println(time.Now())
now := time.Now()
t := now.Add(3 * time.Hour)
fmt.Println(t)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time4.go
2019-10-03 10:41:26.584561434 +0800 CST m=+0.000090932
2019-10-03 13:41:26.58466329 +0800 CST m=+10800.000192739
11.6解析时间区间
time.ParseDuration
可以将时间格式解析,time.ParseDuration
又两个返回值
d,err := time.ParseDuration("3h2m5s")
fmt.Println(err,d)
代码块
package main
import (
"fmt"
"time"
)
func main(){
d,err := time.ParseDuration("3h2m5s")
fmt.Println(err,d)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time5.go
<nil> 3h2m5s
并且可以转换成小时,分钟,秒,只需使用Hours,Minutes,Seconds即可
fmt.Println(d.Hours())
package main
import (
"fmt"
"time"
)
func main(){
d,err := time.ParseDuration("3h2m5s")
fmt.Println(err,d)
fmt.Println(d.Hours())
fmt.Println(d.Minutes())
fmt.Println(d.Seconds())
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run time5.go
<nil> 3h2m5s
3.0347222222222223
182.08333333333334
10925
12.md5
crypto/md5的计算hash,在使用md5.sum的时候需要传入一个字节,如果传入的是字符串,需要转换下,而后计算hash结果,转换后是byte类型的数组,而后将数组转换成一个16进制
- 示例
计算mark的md5值
func main(){
md := md5.Sum([]byte("mark"))
fmt.Println(md)
}
打印
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run md5.go
[234 130 65 12 122 153 145 129 107 94 238 235 225 149 226 10]
- 转换16进制
转换成16进制,使用fmt.Printf("%x",md)
即可,但是这里是16进制的int类型,这里的%x
百分号小x是小写
func main(){
md := md5.Sum([]byte("mark"))
fmt.Printf("%x",md)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run md5.go
ea82410c7a9991816b5eeeebe195e20a
- 转换16进制字符串
如果要转换成字符串,就使用fmt.Sprintf
或者hex.EncodeToString
进行转换。要使用hex.EncodeToString
就需要导入包
import "encoding/hex"
Sprintf
转换字符串,这里的%X
将会转换成大写
md := md5.Sum([]byte("mark"))
x := fmt.Sprintf("%X",md)
fmt.Println(x)
hex.EncodeToString
转换字符串
fmt.Println(hex.EncodeToString(md[:]))
代码块
package main
import (
"fmt"
"crypto/md5"
"encoding/hex"
)
func main(){
md := md5.Sum([]byte("mark"))
fmt.Printf("%xn",md)
fmt.Printf("%Tn",md)
x := fmt.Sprintf("%X",md)
fmt.Println(hex.EncodeToString(md[:]))
fmt.Println(x)
fmt.Printf("%T",x)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run md5.go
ea82410c7a9991816b5eeeebe195e20a
[16]uint8
ea82410c7a9991816b5eeeebe195e20a
EA82410C7A9991816B5EEEEBE195E20A
string
12.1md5.New批量计算
通常值比较小直接就可以进行计算,如果值比较大,就可以使用md5.New一个对象进行批量计算,但是计算的结果和一次计算也是一样的。
- 示例
定义一个m的md5.New
m := md5.New()
而后通过m.Write批量计算
m.Write([]byte("m"))
m.Write([]byte("a"))
m.Write([]byte("r"))
m.Write([]byte("k"))
而后通过sum计算,但是这里sum传递一个nil即可,因为这里没有值
fmt.Printf("%xn",m.Sum(nil))
代码块
[root@linuxea.com /opt/Golang/work4/stdpkg]# cat md52.go
package main
import (
"fmt"
"crypto/md5"
)
func main(){
m := md5.New()
m.Write([]byte("m"))
m.Write([]byte("a"))
m.Write([]byte("r"))
m.Write([]byte("k"))
fmt.Printf("%xn",m.Sum(nil))
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run md52.go
ea82410c7a9991816b5eeeebe195e20a
13.base64
使用base64,需要导入"encoding/base64"
,转换成string类型,加上EncodeToString
base64编码和解码都较为简单
- 编码示例
package main
import (
"encoding/base64"
"fmt"
)
func main(){
e := base64.StdEncoding.EncodeToString([]byte("mark"))
fmt.Println(e)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run base64.go
bWFyaw==
- 解码示例
解码使用base64.StdEncoding.DecodeString
,会返回两个返回值,这里使用bytes和err接收
package main
import (
"encoding/base64"
"fmt"
)
func main(){
e := base64.StdEncoding.EncodeToString([]byte("mark"))
fmt.Println(e)
bytes,err := base64.StdEncoding.DecodeString(e)
fmt.Println(string(bytes),err)
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run base644.go
bWFyaw==
mark <nil>
除了这些还有URLEncoding
,RawURLEncoding
,RawEncoding
14.日志[log]
log模块,首先要导入log模块
- log示例
package main
import (
"log"
)
func main(){
log.Printf("[info] %s","susu")
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run log.go
2019/10/03 15:47:13 [info] susu
- log和Panic示例
Panicf会答应日志并触发一个Panicf
package main
import (
"log"
)
func main(){
log.Printf("[info] %s","susu")
log.Panicf("[Panicf] %s","error")
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run log.go
2019/10/03 15:55:23 [info] susu
2019/10/03 15:55:23 [Panicf] error
panic: [Panicf] error
goroutine 1 [running]:
log.Panicf(0x4c673f, 0xb, 0xc000043f78, 0x1, 0x1)
/usr/local/go/src/log/log.go:340 +0xc0
main.main()
/opt/Golang/work4/stdpkg/log.go:8 +0xcb
exit status 2
- log.Fatalf示例
Fatalf在打印日志后也会退出
package main
import (
"log"
)
func main(){
log.Printf("[info] %s","susu")
//log.Panicf("[Panicf] %s","error")
log.Fatalf("[Fatalf] %s","Fatalf")
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run log.go
2019/10/03 16:00:27 [info] susu
2019/10/03 16:00:27 [Fatalf] Fatalf
exit status 1
- log.SetPrefix示例,日志加前缀
日志加前缀[SetPrefix-]
,如下:
log.SetPrefix("SetPrefix-")
将这段放在哪里,后面的日志中就会有这个前缀,
package main
import (
"log"
)
func main(){
log.Printf("[info] %s","susu")
log.SetPrefix("SetPrefix-")
log.Fatalf("[Fatalf] %s","Fatalf")
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run log.go
2019/10/03 16:34:05 [info] susu
SetPrefix-2019/10/03 16:34:05 [Fatalf] Fatalf
exit status 1
- 日志加上文件名
log.SetFlags(log.Flags() | log.Lshortfile )
,Lshortfile打印的是文件名i
package main
import (
"log"
)
func main(){
log.Printf("[info] %s","susu")
log.SetPrefix("SetPrefix-")
log.SetFlags(log.Flags() | log.Lshortfile )
log.Fatalf("[Fatalf] %s","Fatalf")
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run log.go
2019/10/03 17:13:19 [info] susu
SetPrefix-2019/10/03 17:13:19 log.go:14: [Fatalf] Fatalf
exit status 1
log.SetFlags(log.Flags() | log.Llongfile)
,Llongfile打印的是文件全路径
package main
import (
"log"
)
func main(){
log.Printf("[info] %s","susu")
log.SetPrefix("SetPrefix-")
log.SetFlags(log.Flags() | log.Llongfile)
log.Fatalf("[Fatalf] %s","Fatalf")
}
运行
[root@linuxea.com /opt/Golang/work4/stdpkg]# go run log.go
2019/10/03 17:14:19 [info] susu
SetPrefix-2019/10/03 17:14:19 /opt/Golang/work4/stdpkg/log.go:14: [Fatalf] Fatalf
exit status 1