<<GO语言核心36讲笔记-Part2>>

第二章重点:

Go 的源码文件分类:

在第一章的时候已经提及到了这个关键问题:

(1)命令源码文件:
    声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。
    命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的
    可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,
    就会安装到 GOBIN 指向的目录下。

(2)库源码文件
    
    库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。

(3)测试源码文件

    名称以 _test.go 为后缀的代码文件,并且必须包含 Test 或者 Benchmark 名称前缀的函数。

GO语言的flag包:

微课堂主要介绍了一下flag包的用法。并且付上了官方文档。所以在这里稍微列举一下用法。

flag的定义:

flag.String(), Bool(), Int() //这里这是列举了几个

然后就是两种定义的方式:

var ip = flag.Int("flagname", 1234, "help message for flagname") //ip 为指针类型,Int或者
String返回的都是指针类型

flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")//此处需要在外面手动定义flagvar

第一种方式是返回一个值,第二种方式是把变量的传进去。

通过flag.Var()绑定自定义类型,自定义类型需要实现Value接口(Receives必须为指针),如:

flag.Var(&flagVal, "name", "help message for flagname")

对于这种类型的flag,默认值为该变量类型的初始值

flag的解析

flag.Parse()

解析函数将会在碰到第一个非flag命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数,如命令行参数为cmd --flag=true abc则第一个非flag命令行参数为“abc”

flag解析后的参数使用

fmt.Println("ip has value ", *ip)
fmt.Println("flagvar has value ", flagvar)

命令行语法

-flag //只支持bool类型
-flag=x
-flag x //只支持非bool类型

注意第三种只支持非bool类型,原因就是如果文件的名字为false的话那么就会产生歧义。看例子:

package main

import (
    "flag"
    "fmt"
)

var name string
var right bool
func init() {
    flag.StringVar(&name, "name", "everyone", "The greeting object.")
    flag.BoolVar(&right, "check", false, "The right ob")
}

func main() {
    flag.Parse()
    Hello(name)
    fmt.Println(right)
}

这里采用的还是老师的例子,只多加了个bool类型。
我们编译之后生成exe

demo4.exe -check false
demo4.exe -check

对于这两种都会采用默认的bool类型true。

demo4.exe -check=false

只有这样的时候,才会采用false

定义自己的参数使用说明

第一种:

最简单就是修改Usages这个函数变量:

var Usage = func() {
    fmt.Fprintf(CommandLine.Output(), "Usage of %s:\n", os.Args[0])
    PrintDefaults()
}

我们可以看一下源码里面采用的是第一个参数的名字也就是我们的exe文件。

var Usage = func() {
    fmt.Fprintf(CommandLine.Output(), "HaoLin guid%s:\n", "wenxuwan")
    PrintDefaults()
}
这样你就可以定义输出了

郝林老师还讲了更深入的定义自己的类型。主要是更深入的定义flag包里面的一些对象实现自己的方法,具体可以看下源码。

思考题

1. 默认情况下,我们可以让命令源码文件接受哪些类型的参数值?
这个从flag包的代码包里面就可以看到,这里贴一下班里一个同学的答案

    int(int|int64|uint|uint64),
    float(float|float64)
    string,
    bool,
    duration(时间),
    var(自定义)


2. 我们可以把自定义的数据类型作为参数值的类型吗?如果可以,怎样做?

    当然是可以的:
    // Var defines a flag with the specified name and usage string. The type and
    // value of the flag are represented by the first argument, of type Value, which
    // typically holds a user-defined implementation of Value. For instance, the
    // caller could create a flag that turns a comma-separated string into a slice
    // of strings by giving the slice the methods of Value; in particular, Set would
    // decompose the comma-separated string into the slice.
    func Var(value Value, name string, usage string) {
        CommandLine.Var(value, name, usage)
    }

    type pepoInfo struct{
        name string
        age int
        homeAdress string
    }

    func (p * pepoInfo) Set(val string) error{
        peopleList := strings.Split(val, ",")
        p.name = peopleList[0]
        p.age,_ =  strconv.Atoi(peopleList[1])
        p.homeAdress = peopleList[2]
        return nil
    }   

    func (s *pepoInfo) String() string {
        infoList := strings.Split("wenxuwan,20,山东", ",")
        s.name = infoList[0]
        s.age,_ = strconv.Atoi(infoList[1])
        s.homeAdress = infoList[2]
        return "It's none of my business"
    }
    func main(){

    var people pepoInfo
    flag.Var(&people, "info", "hao ma fan")
    flag.Parse()
    //打印结果slice接收到的值
    fmt.Println(people)
    }

demo4.exe --info wenxuwan,10,shouguang
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 我是坐落在远洋中的一座孤岛,无人晓,无船近,鱼儿逃。 说出这话的人并非闻名遐迩的大作家,而是一个13岁晚期尿毒症患...
    东边有篱笆阅读 192评论 0 1
  • 生活就像一面镜子,你欺骗了他,他也必定会欺骗你。每件事物都会有因果关系。就像在工作中,假如我们一时间欺骗了它,可能...
    汇鑫财税_郭迎勃阅读 1,443评论 0 1
  • 昨晚说了一夜情的事。 我差点也犯了与众多人一样站在道德的制高点上去道德绑架一夜情这一事。 虽然当时店长与我们谈论时...
    夏励阅读 367评论 0 0