标准库之 flag、strconv

1|0一、flag库

  • flag库的作用同python中的 sys.argv 差不多,是Go语言自带的解析运行Go脚本时,后面跟着的参数(俗称:命令行参数)的一个库
  • 定义好flag之后,就能像登录mysql时一样,mysql -u root -h 192.168.30.20,这里的 -u 和 -h就是相当于flag定义好的参数名
  • flag接收的命令行参数可以直接使用,因为它们的类型是定义flag参数时已经指定好的

1|11. flag的简单替代

  • 若你只是想简单的获取命令行参数,可以使用 os.Args方法获取,只能接收成string类型,后面需要根据需求自己转换类型
package main import ( "fmt" "os" ) // os.Args demo func 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 .\test3.go PS C:\GolandProjects\hsw_test> .\test3.exe a b c d 3e args[0]=C:\GolandProjects\hsw_test\test3.exe args[1]=a args[2]=b args[3]=c args[4]=d args[5]=3e PS C:\GolandProjects\hsw_test> go run .\test3.go a b c d e args[0]=C:\Users\hsw\AppData\Local\Temp\go-build686863642\b001\exe\test3.exe args[1]=a args[2]=b args[3]=c args[4]=d args[5]=e 分析:上面用了两种执行方式: 1. 先build,再执行生成的编译文件test3.exe,在 test3.exe 后面跟上参数 2. 直接go run test3.go ,运行test3.go 文件(相当于在内存中编译后再执行编译内容,不会生成 .exe文件),test3.go 后面跟上参数 */

1|22. flag的参数类型

  • flag包支持的命令行参数类型有boolintint64uintuint64float float64stringduration,在定义时,这些类型的首字母要大写
flag参数 有效值
字符串flag 合法字符串
整数flag 1234、0664、0x1234等类型,也可以是负数
浮点数flag 合法浮点数
bool类型flag 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
时间段flag 任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”
合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”

1|33. flag参数的定义

  • 共有两种定义方式

1|0(1)flag.Type()

定义语法: flag.Type(参数名, 默认值, 提示信息) flag.Type(参数名, 默认值, 提示信息) 返回的是指针,解析之后需要用 * 来取值 示例: package main import ( "flag" "fmt" "time" ) func main() { //定义命令行参数方式1 name := flag.String("name", "张三", "姓名") age := flag.Int("age", 18, "年龄") married := flag.Bool("married", false, "婚否") delay := flag.Duration("d", 0, "时间间隔") // 解析命令行参数,必须先定义再解析,只有解析之后程序才能接收到命令行参数 // 需要注意的是,此时name、age、married、delay均为对应类型的指针************** flag.Parse() fmt.Println("111222333") fmt.Println(name, age, married, delay) fmt.Println(*name, *age, *married, *delay) } /* PS C:\GolandProjects\hsw_test> go run .\test3.go -name=锅包肉 -age=18 -married=false -d=1s 111222333 0xc000020080 0xc00000a148 0xc00000a150 1s 锅包肉 18 false 1s PS C:\GolandProjects\hsw_test> 分析:可以发现时间间隔类型,无需取值也可以直接输出值 */

1|0(2)flag.TypeVar()

定义语法: flag.TypeVar(指针变量, 参数名, 默认值, 提示信息) 示例: package main import ( "flag" "fmt" "time" ) func main6() { //定义命令行参数方式2 var name string var age int var married bool var delay time.Duration flag.StringVar(&name, "name", "张三", "姓名") flag.IntVar(&age, "age", 18, "年龄") flag.BoolVar(&married, "married", false, "婚否") flag.DurationVar(&delay, "d", 0, "延迟的时间间隔") //解析命令行参数 flag.Parse() fmt.Println(name, age, married, delay) //返回命令行参数后的其他参数 fmt.Println(flag.Args()) //返回命令行参数后的其他参数个数 fmt.Println(flag.NArg()) //返回使用的命令行参数个数 fmt.Println(flag.NFlag()) }

1|44. flag解析命令行参数

  • flag.Parse()方法用来解析上面定义的flag参数,只有解析之后程序才能接收到命令行参数
  • 只有命令行参数使用规定的写法,flag.Parse()才能正确解析
下面的flag为定义的参数名,xxx为参数值,命令行参数格式共有下面4种写法: 注意:布尔类型的参数必须使用等号的方式指定 注意:Flag解析在第一个非flag参数(单个“-”不是程序中定义的flag参数)之前停止,或者在终止符“–”之后停止 -flag xxx // (使用空格,一个-符号) --falg xxx // (使用空格,两个-符号) -flag=xxx // (使用等号,一个-符号) --falg=xxx // (使用等号,两个-符号)

1|55. flag其他方法

flag.Args() // 返回命令行参数后的其他参数,以[]string类型 flag.NArg() // 返回命令行参数后的其他参数个数 flag.NFlag() // 返回使用的命令行参数个数

2|0二、strconv库

  • Go语言中strconv包实现了基本数据类型和字符串之间的相互转换
  • 这里只介绍了strconv库中常用的几个函数: Atoi()Itia()、parse系列、format系列、append系列
  • 浮点型和整型之间可以通过 int() float()函数直接强制转换,但是它们和字符串之间是不能直接用 string()转换的

2|11. string转换为int类型

  • Atoi()方法实现了字符串转换成整型
函数的定义: func Atoi(s string) (i int, err error) 如果传入的字符串参数无法转换为int类型,就会返回错误 示例: package main import ( "fmt" "strconv" ) func main() { s1 := "100" i1, err := strconv.Atoi(s1) if err != nil { fmt.Println("can't convert to int") } else { fmt.Printf("type:%T value:%#v\n", i1, i1) // type:int value:100 } }

2|22. int转换为string类型

  • Itoa()方法实现了整型转换成字符串类型
函数的定义: func Itoa(i int) string 示例: package main import ( "fmt" "strconv" ) func main() { i2 := 200 s2 := strconv.Itoa(i2) fmt.Printf("type:%T value:%#v\n", s2, s2) // type:string value:"200" }

2|33. Parse系列函数

  • Parse类函数作用是将字符串转换为指定类型的值
  • 共有如下几种方法 ParseBool()、ParseInt()、ParseUint()、ParseFloat()

1|0(1)ParseBool()

函数的定义: func ParseBool(str string) (value bool, err error) - 返回字符串表示的bool值。它接受10、t、f、T、F、truefalse、True、False、TRUE、FALSE;否则返回错误

1|0(2)ParseInt()

函数的定义: func ParseInt(s string, base int, bitSize int) (i int64, err error) - 返回字符串表示的整数值,接受正负号 - base指定进制(236),如果base为0,则会从字符串前置判断,”0x”是16进制,”0”是8进制,否则是10进制 - bitSize指定结果必须能无溢出赋值的整数类型,08163264 分别代表 intint8int16int32int64 - 返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange

1|0(3)ParseUnit()

函数的定义: func ParseUint(s string, base int, bitSize int) (n uint64, err error) - ParseUint类似ParseInt但不接受正负号,用于无符号整型

1|0(4)ParseFloat()

函数的定义: func ParseFloat(s string, bitSize int) (f float64, err error) - 解析一个表示浮点数的字符串并返回其值 - 如果s合乎语法规则,函数会返回最为接近s表示值的一个浮点数(使用IEEE754规范舍入) - bitSize指定了期望的接收类型,32float32(返回值可以不改变精确值的赋值给float32),64float64 - 返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange

1|0(5)示例

package main import ( "fmt" "strconv" ) func main() { b, err1 := strconv.ParseBool("true") f, err2 := strconv.ParseFloat("3.1415", 64) i, err3 := strconv.ParseInt("-2", 10, 64) u, err4 := strconv.ParseUint("2", 10, 64) fmt.Println(b, err1) fmt.Println(f, err2) fmt.Println(i, err3) fmt.Println(u, err4) } /* true <nil> 3.1415 <nil> -2 <nil> 2 <nil> */

2|44. Format系列函数

  • Format系列函数实现了将给定类型数据格式化为string类型数据的功能
  • 共有如下几种方法 FormatBool()、FormatInt()、FormatUint()、FormatFloat()

1|0(1)FormatBool()

函数的定义: func FormatBool(b bool) string - 根据b的值返回”true”或”false

1|0(2)FormatInt()

函数的定义: func FormatInt(i int64, base int) string - 返回i的base进制的字符串表示。base 必须在236之间,结果中会使用小写字母’a’到’z’表示大于10的数字

1|0(3)FormatUint()

函数的定义: func FormatUint(i uint64, base int) string - 是FormatInt的无符号整数版本

1|0(4)FormatFloat()

函数的定义: func FormatFloat(f float64, fmt byte, prec, bitSize int) string - 函数将浮点数表示为字符串并返回 - bitSize表示f的来源类型(32float3264float64),会据此进行舍入 - fmt表示格式:’f’(-ddd.dddd)、’b’(-ddddp±ddd,指数为二进制)、’e’(-d.dddde±dd,十进制指数)、’E’(-d.ddddE±dd,十进制指数)、’g’(指数很大时用’e’格式,否则’f’格式)、’G’(指数很大时用’E’格式,否则’f’格式) - prec控制精度(排除指数部分):对’f’、’e’、’E’,它表示小数点后的数字个数;对’g’、’G’,它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f

1|0(5)示例

func main() { s1 := strconv.FormatBool(true) s2 := strconv.FormatFloat(3.1415, 'E', -1, 64) s3 := strconv.FormatInt(-2, 16) s4 := strconv.FormatUint(2, 16) fmt.Println(s1) fmt.Println(s2) fmt.Println(s3) fmt.Println(s4) } /* true 3.1415E+00 -2 2 */

2|55. 其他(了解即可)

1|0(1)isPrint()

函数的定义: func IsPrint(r rune) bool - 返回一个字符是否是可打印的,和unicode.IsPrint一样,r必须是:字母(广义)、数字、标点、符号、ASCII空格

1|0(2)CanBackquote()

函数的定义: func CanBackquote(s string) bool - 返回字符串s是否可以不被修改的表示为一个单行的、没有空格和tab之外控制字符的反引号字符串

__EOF__

本文作者BigSun丶
本文链接https://www.cnblogs.com/Mcoming/p/18055993.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   BigSun丶  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示