22-flag标准库
原文链接 视频 126 Go 语言内置的 flag 包实现了命令行参数的解析,flag 包使得开发命令行工具更为简单。 22.1 os.Args如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用 os.Args 来获取命令行参数。 12345678910111213141516package mainimport ( "fmt" "os")//os.Args demofunc main() { //os.Args是一个[]string if len(os.Args) > 0 { for index, arg := range os.Args { fmt.Printf("args[%d]=%v\n", index, arg) } }} 将上面的代码执行 go build -o "args_demo" 编译之后,执行: 123456$ ./args_demo a b c dargs[0]=./args_demo...
flag
概述在运行命令行程序时,通常通过命令行参数对程序运行进行配置。在go程序中使用flag包,可以快速构建命令行程序,对于程序使用者只需要声明所需命令行参数。 使用示例创建命令行程序可以分为两步: 声明命令行参数 运行flag.Parse,对参数进行解析 然后就可以读取命令行参数了。例如如下程序可以创建一个命令行程序demo --foo hello --bar world 1234567891011121314package mainimport ( "fmt" "flag")func main() { foo := flag.String("foo", false, "Foo") bar := flag.String("bar", "", "Bar") flag.Parse() fmt.Print(*foo, *bar)} VarXXX 和 XXXflag包中对多中提供了两类参数声明...
heap
概述container/heap包对通用堆进行了定义并实现了标准堆操作函数,以此为基础可以很容易对各类堆和优先队列进行实现。 类型接口heap包中最核心的就是heap.Interface接口,堆的基础存储是一个树形结构,可以用数组或是链表实现。通过heap的函数,可以建立堆并在堆上进行操作;要使用heap包的函数,你的类需要实现heap.Interface接口,定义如下: 12345678910111213// heap.Interfacetype Interface interface { sort.Interface Push(x interface{}) // 在Len()位置插入一个元素 Pop() interface{} // 删除并返回Len()-1位置的元素}// sort.Interfacetype Interface interface { Len() // 获...
list
概述container/list包实现了基本的双向链表功能,包括元素的插入、删除、移动功能 链表元素链表中元素定义如下: 123456type Element struct { Value interface{}}func (e *Element) Next() *Elementfunc (e *Element) Prev() *Element 通过Value属性来获取元素的值,此外Element还有两个方法Next和Prev分别获取当前元素的前一个元素和后一个元素。 成员函数初始化可以通过调用New函数或者Init方法来初始化一个空的list,此外Init也可以重置一个list。函数声明如下: 12func New() *Listfunc (l *List) Init() *List 遍历对于链表来说,遍历是最常用的操作,遍历操作一共三步: 第一步,获取一个遍历起始点;使用Front或Back获取一个链表的头和尾,其函数声明如下: 12func (l *List) Front() *Listfunc (l *Lis...
ring
概述Ring是一种循环链表结构,没有头尾,从任意一个节点出发都可以遍历整个链。其定义如下,Value表示当前节点的值: 123type Ring struct { Value interface{} } 类型方法NewRing.New用于创建一个新的Ring,接收一个整形参数,用于初始化Ring的长度,其方法定义如下: 1func New(n int) *Ring Next & Prev作为一个链表,最重要的操作进行遍历,可以通过Next和Prev方法获取当前节点的上一个节点和下一个节点,方法定义如下: 12func (r *Ring) Next() *Ringfunc (r *Ring) Prev() *Ring 通过这两个方法可以对一个ring进行遍历,首先保存当前节点,然后依次访问下一个节点,直到回到起始节点,代码实现如下: 1234567p := ring.Next()// do something with first elementfor p != ring { // do someth...
15-日志库
15 日志库15.1 标准日志库 log原文链接 《Go语言标准库log介绍》 Go 语言内置的 log 包实现了简单的日志服务。 15.1.1 使用 Loggerlog 包定义了 Logger 类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数 Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和 Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个 logger 对象更容易使用。 例如,我们可以像下面的代码一样直接通过 log 包来调用上面提到的方法,默认会将日志信息打印到终端界面: 12345678910111213package mainimport ( "log")func main() { log.Println("普通的日志打印") str := "日志打印" log.Printf("格式化的 %s", str) log.Fata...
log
概述log 模块用于在程序中输出日志,它的使用十分简单,类似于fmt中的Print,一个最简单的示例如下: 1234567package mainimport "log"func main() { log.Print("Hello World")} 上面的程序会在命令行打印一条日志: 1>>> 2018/05/16 16:48:06 Hello World LoggerLogger是写入日志的基本组件,log模块中存在一个标准Logger,可以直接通过log进行访问,所以在上一节的例子中可以直接使用log.Print进行日志进行输出。但是在实际使用中,不同类型的日志可能拥有需求,仅标准Logger不能满足日志记录的需求,通过创建不同的Logger可以将不同类型的日志分类输出。使用logger前需要首先通过New函数创建一个Logger对象,函数声明如下: 1func New(out io.Writer, prefix string, flag int) *Logger 函数接收三个参数分别是日...
1.概述&io.go
io包一共分为两块:主目录和ioutil目录。总得来说,还是比较干净的。在整个io包中,有以下几个文件: io.gomulti.gopipe.goioutil ioutil.gotempfile.go 比起原来的reflect包来说,内容还是多了不少。 先看一下io.go的代码,内容不多,一共才530行。multi.go更少,一共100行。pipe.go则是200行。这样的代码倒是非常方便阅读。 至于ioutil包里的两个代码,也分别在200行左右。 在io.go的代码段中,有一段都是用来定义接口的。 1234567891011121314151617181920211、type Reader interface {} 2、type Writer interface {} 3、type Closer interface {} 4、type Seeker interface {} 5、type ReadWriter interface {} 6、t...














