• 姜雨生 置顶
    2019-02-28
    flag的讲解很棒,通过这个命令,我们就可以控制程序在不同环境的执行内容了,通过控制参数设置更多的内容!
    
     7
  • 咖啡色的羊驼
    2018-08-13
    看完本文,记住的两点:
    1.源码文件分为三种:命令,库,测试。
    2.编写命令源码文件的关键包: flag。

    回答下问题:
    1.命令源码文件支持的参数:
          int(int|int64|uint|uint64),
          float(float|float64)
          string,
          bool,
          duration(时间),
          var(自定义)
    2.关键就是使用flag.var(),关键点在于需要实现flag包的Value接口。


    展开
    
     75
  • Dragoonium
    2018-08-13
    我试着把参数增加到两个,然后试试运行结果
    func init() {
      flag.StringVar(&name, "name1", "ladies", "The greeting object 1")
      flag.StringVar(&name, "name2", "gentlemen", "The greeting object 2")
    }

    # go run test.go
    Hello gentlemen!
    和想像的一样,name2的默认值覆盖了name1的默认值

    # go run test.go -name1=Robert
    Hello Robert!
    和想像的略有不同,只指定了name1,没有指定name2,输出了name1的指定值,name2的默认值没有生效

    # go run test.go -name2=Jose
    Hello Jose!
    没毛病

    # go run test.go -name1=Robert -name2=Jose
    Hello Jose!
    没毛病

    # go run test.go -name2=Jose -name1=Robert
    Hello Robert!
    这有点奇怪了,输出的值是以参数的先后顺序为准的,而不是以flag.StringVar函数的顺序为准的
    展开
     2
     53
  • Abirdcfly
    2018-08-14
    解答一下Dragoonium同学的疑惑,在flag包的文档里第一个example里就有你提到的这种情况,注释已经说明白了。

    我不太精确的翻译一下:

    两个flag分享一个变量时可以用来做命令参数缩写,由于初始化顺序未定义,所以要确保两者使用同一默认值,并且他们必须在init()函数中设置
     1
     19
  • Tron
    2018-09-05
    go语言ide还是推荐goland
    
     15
  • 何何何何何少侠
    2018-12-08
    1. 默认情况下,我们可以让命令源码文件接受哪些类型的参数值?
        答:前面讲过`flag`是专门用来处理命令行参数的包,所以我们只需要看`flag`这个包支持哪些数据结构就行了。结果如下:
        * int(int|int64|uint|uint64),
        * float(float|float64)
        * string,
        * bool,
        * time.duration(时间),
        * var(自定义,如FlagSet、Flag、实现Value接口等)
    2. 我们可以把自定义的数据类型作为参数值的类型吗?如果可以,怎样做?
        答:显然是可以的,从上面的回答来看就知道可以。实现方式可以参考源码中`flag.CommandLine.Var(value Value,name string,usage string)`的实现,核心在于自定义的数据类型需要实现`Value`接口,只要实现了`Value`接口,这个问题也就解决了。
    1. 目录结构
        * rexlin600(我的`GOPATH`)
            * pkg
            * bin
            * src
                * flagfunc
                    * custom_type.go
                    * tflag.go
                * main
                    * main.go
        
        2. 编写`main.go`和`tflag.go`以及自定义的`custom_type.go`
        `main.go`
        ```
        package main
        import (
            "flagfunc"
            "fmt"
        )
        // main method
        func main() {
            fmt.Println("==> hello,", flagfunc.CustomFlag)
        }
        ```
        
        `tflag.go`
        ```
        package flagfunc
        import (
            "flag"
            "fmt"
        )
        var CustomFlag customFlag
        // 测试自定义数据类型flag
        func TestCustomFlag() {
            fmt.Println("==> package flagfunc")
            // custom define Value
            flag.CommandLine.Var(&CustomFlag, "custom", "custom define test")
            // After all flags are defined, call flag.Parse() to parse the command line into the defined flags.
            flag.Parse()
        }
        ```
        
        `custom_type.go`
        ```
        package flagfunc
        import (
            "strings"
        )
        type customFlag string
        func newStringValue(val string, p *string) *customFlag {
            *p = val
            return (*customFlag)(p)
        }
        func (a *customFlag) Set(str string) error {
            str = strings.TrimSpace(str)
            *a = customFlag(str)
            return nil
        }
        func (a *customFlag) String() string { return "" }
        ```
        3. 测试:进入main.go所在路径,输入命令`go run main.go custom="{"\"rexlin600\"",18,"\"3072@qq.com\""}"`即可
    展开
    
     9
  • wjq310
    2018-08-15
    demo3之后,要import os
    
     9
  • javaadu
    2018-08-13
    喜欢这种重实践和编码的风格,便于上手
    
     9
  • 云学
    2018-08-13
    init在main之前执行,go程序的执行顺序是否可以讲下
    
     6
  • alan
    2018-08-13
    感谢老师。感觉编码细节有些偏多了哈,希望多一些总结性和主观的内容。
    
     6
  • 吉祥
    2018-08-13
    undefined: os 怎么回事

    作者回复: 你好,请到GitHub上下载完整的源码文件。

    
     4
  • zhaopan
    2019-02-17
    1. 会出现冲突
    2. 导入包的几种方式
      2.1 常规方式
        import “your/lib”
        通过包名lib调用SayHello方法。lib.SayHello()
      2.2 别名方式
        import m “your/lib”
        这里的 m 是包名 lib 的别名,m.SyayHello() 。该方式合适的场景:
        1.包名过于复杂或者意思不明确。
        2.包名和其他包冲突。
          import mongo "mywebapp/libs/mongodb/db"
          import ydbgo "mywebapp/libs/yundb/db"
      2.3 省略包名
        import . “your/lib”
        这里的点.符号表示,对包 lib 的调用直接省略包名.
      2.4 初始化方式
        improt _ “your/lib”
        特殊符号“_” 仅仅会导致 lib 执行初始化工作,如初始化全局变量,调用 init 函数。


    展开
    
     3
  • 梦里追逐
    2018-08-15
    咱们用的都是哪个IDE?

    作者回复: 你好,我用的是goland,但是代码不会依赖于IDE的,只会依赖于Go语言本身。免费的编辑器推荐vs code。

    
     2
  • 成都福哥
    2018-08-15
    用自定义的cmdLine的时候,usage函数里的flag.PrintDefaults()应该相应的变成cmdLine.PrintDefaults()吧。
    
     2
  • 丸子说
    2018-08-14
    从flag.stringvar/flag.string到flag.commandline再到私有cmdline命令参数容器,循序渐进,由浅到深。
    
     2
  • 芒果
    2018-08-14
    关于变量以标准输入为准的问题,我个人认为init中的定义只是定义了解析规则,真正执行解析是flag.Parse()时开始,因此以标准输出为准。想想我们自己写的时候会怎么实现,先获得输入如:-name1=a,然后解析为key=name1和value=a,然后走一个if,else判断,如果key匹配则对其赋值。所以就很好解释了。个人感觉自己的理解还是比较靠谱的,虽然没有研究源码。欢迎大神们交流
    
     2
  • 松烽
    2018-08-14
    自定义参数,还可以自己通过字符串转对象的方式实现
    
     2
  • 飞吧蛐蛐
    2018-10-12
    问题1:通过flag库的提示,或者看flag包的用法,参数支持Bool/Duration/Float64/Int/Int64/Uint/Uint64,也支持Float32,猜测考虑到精度问题,flag没有支持float32。
    问题2:参数值的类型可以是自定义的数据类型,使用实现flag包里的Value接口,然后使用flag.Var()实现。(flag源码里有提示,Value is the interface to the dynamic value stored in a flag)

    PS:看一下flag包的用法和源码就能解答这两个问题了。
    展开
    
     1
  • 属鱼
    2018-09-12
    给VS Code的用户一个脚本,用于安装VS Code的Go扩展所需要的。
    VS code的go插件需要的扩展组件有的需要翻墙,安装不了,
    Linux
    https://github.com/cloudfstrife/note/blob/develop/golang/install_vs_code_golang_ext_tools.sh

    windows
    https://github.com/cloudfstrife/note/blob/develop/golang/install_vs_code_golang_ext_tools.ps1
    这个是powershell脚本,在win7 powershell 5测试通过。

    执行powershell 需要 修改策略,详见:
    http://www.cnblogs.com/Jim-william/p/5492507.html

    ## 注意shell中的说明,GOPATH目前只支持一个目录。
    展开
    
     1
  • mayunian
    2018-08-30
    老师,今天试了一下类型转换。
    为什么转换var x uint = uint(-1) 的时候会报错?
    而var y int = -1
    var x uint = uint(y)就不会报错呢?

    作者回复: -1是负数,编译器看出来了,帮你挑出来。y是int类型的变量,编译器不知道里面存的是不是负数,没法帮你挑出来。转换会成功结果会不正确。

    
     1
我们在线,来聊聊吧