我的Go+语言初体验——玩转 Go+ 命令行

llyfly 社区贡献者 2021-12-14 22:56:00

“我的Go+语言初体验” | 征文活动进行中......

目录

什么是 Go+

什么是命令行

Args 介绍

基础标识

NewFlagSet 妙用


什么是 Go+

Go+ 是一门融合工程开发的 Go、数据科学领域的 Python、编程教学领域的 Scratch,以 Python 之形结合 Go 之心,让工程师处理数据不需要学习新的开发语言,让初学者学习编程、开发作品的门槛更低的编程语言。

什么是命令行

命令行参数是参数化程序执行的常用方法。比如,gop run hello.go 命令中使用 gop 程序的 run 参数和 hello.go 参数。Go+ 提供了命令行参数的使用方法,今天我们就来了解一下这方面的一些内容。

Args 介绍

Args 包含了程序执行时所有相关的命令行参数信息,并且以数组的形式进行收集保存,我们可以通过解析 os.Args 属性获取对应的命令行参数。简单写一段 Go+ 代码:

import (
    "os"
)
 
argsWithProg := os.Args
arg := os.Args[0]
println("参数数组:", argsWithProg)
println("参数1:", arg)

输出结果:

参数数组: [/tmpfs/play]
参数1: /tmpfs/play

基础标识

基本标识声明可用于字符串、整数和布尔选项。比如,我们声明一个字符串标识词,其默认值为“foo”,并有一个简短的描述。然后,以相同的方式声明一个整型和布尔类型的标识。示例代码如下:

wordPtr := flag.String("word", "foo", "a string")
numbPtr := flag.Int("numb", 42, "an int")
forkPtr := flag.Bool("fork", false, "a bool")

还可以操作一个已经定义好的变量。注意,我们需要传入一个指向标识声明函数的指针。示例代码如下:

var svar string
flag.StringVar(&svar, "svar", "bar", "a string var")

在所有的命令行标识声明后,就调用 flag.Parse 方法执行命令行解析。
下面一段测试代码:

import (
    "flag"
)
 
wordPtr := flag.String("word", "foo", "a string")
numbPtr := flag.Int("numb", 42, "an int")
forkPtr := flag.Bool("fork", false, "a bool")
 
var svar string
flag.StringVar(&svar, "svar", "bar", "a string var")
 
flag.Parse()
 
println("word:", *wordPtr)
println("numb:", *numbPtr)
println("fork:", *forkPtr)
println("svar:", svar)
println("tail:", flag.Args())

执行效果:

word: foo
numb: 42
fork: false
svar: bar
tail: []

将上述代码保存为文件 command-line-flags.gop,编译后,分别执行如下命令。

修改所有命令行标识,命令如下:

./command-line-flags -word=opt -numb=7 -fork -svar=flag

执行结果:

word: opt
numb: 7
fork: true
svar: flag
tail: []

尾部参数在解析标识之后自动匹配,命令如下:

./command-line-flags -word=opt a1 a2 a3

执行结果:

word: opt
...
tail: [a1 a2 a3]

也可以使用 -h 或者 --help 命令查看帮助信息,命令如下:

./command-line-flags -h

执行结果: 

Usage of ./command-line-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string
 

NewFlagSet 妙用

我们可以使用 NewFlagSet 方法定义自己的子命令,同时为该子命令定义特定的新标志。同一个程序中,我们可以定义多个不同的子命令。测试代码如下:

package main
 
import (
    "flag"
    "os"
)
 
 
fooCmd := flag.NewFlagSet("foo", flag.ExitOnError)
fooEnable := fooCmd.Bool("enable", false, "enable")
fooName := fooCmd.String("name", "", "name")
 
barCmd := flag.NewFlagSet("bar", flag.ExitOnError)
barLevel := barCmd.Int("level", 0, "level")
 
if len(os.Args) < 2 {
    println("expected 'foo' or 'bar' subcommands")
    os.Exit(1)
}
 
switch os.Args[1] {
 
case "foo":
    fooCmd.Parse(os.Args[2:])
    println("subcommand 'foo'")
    println("  enable:", *fooEnable)
    println("  name:", *fooName)
    println("  tail:", fooCmd.Args())
case "bar":
    barCmd.Parse(os.Args[2:])
    println("subcommand 'bar'")
    println("  level:", *barLevel)
    println("  tail:", barCmd.Args())
default:
    println("expected 'foo' or 'bar' subcommands")
    os.Exit(1)
}

将上述文件保存成 subcommand.go 文件,然后执行如下命令进行编译:

gop build subcommands.go 

执行如下命令:

./subcommands foo -enable -name=joe a1 a2

输出结果:

subcommand 'foo'
  enable: true
  name: joe
  tail: [a1 a2]

执行如下命令:

./subcommands bar -level 8 a1

输出结果:

subcommand 'bar'
  level: 8
  tail: [a1]

执行如下命令:

./command-line-subcommands bar -enable a1

输出结果:

flag provided but not defined: -enable
Usage of bar:
  -level int
        level

 

“我的Go+语言初体验” | 征文活动进行中......

...全文
1197 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ζ小菜鸡 社区贡献者 2021-12-17
  • 打赏
  • 举报
回复

学习到了,感谢大佬分享

内容概要:本文针对风电功率随机波动对电网频率稳定性的不利影响,提出一种基于灰狼优化算法(GWO)与改进的自适应噪声完备集合经验模态分解(ICEEMDAN)相结合的混合储能功率平抑策略。通过GWO优化ICEEMDAN的关键参数(如噪声幅值、分解层数),以样本熵为适应度函数提升风电功率信号分解精度,有效抑制模态混叠问题;进而构建四阶段协同调控框架:参数优化—自适应分解—互信息熵初级功率分层—模糊控制动态修正中频功率分配,实现低频、中频、高频波动功率的合理分配。该策略结合储能系统中蓄电池与超级电容的特性,利用模糊控制器根据两者实时荷电状态(SOC)动态调整中频功率分配比例,避免过充过放,延长设备寿命。基于实测风电数据的仿真结果表明,该方法显著降低了并网功率波动率,提升了储能运行安全性与系统整体平抑效果。; 适合人群:具备一定电力系统、新能源并网、储能控制背景,熟悉Matlab/Simulink仿真工具,从事相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决风电功率波动导致的电网频率不稳定问题;②优化混合储能系统(蓄电池+超级电容)的功率分配策略;③提升风电并网电能质量与储能系统运行寿命;④为基于智能算法的新能源功率平滑控制提供可复现的技术方案。; 阅读建议:建议结合Matlab代码与Simulink仿真模型进行实践,重点关注GWO参数寻优流程、ICEEMDAN分解效果对比、互信息熵判据应用及模糊规则设计等核心模块,深入理解信号分解与储能状态协同控制的闭环机制。

1,097

社区成员

发帖
与我相关
我的任务
社区描述
Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。 Go+ 官网:https://goplus.org/
其他 企业社区
社区管理员
  • Go+
  • 杨东杰
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

本社区为 Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。

Go+ 官网:https://goplus.org/
GitHub地址:https://github.com/goplus/gop

试试用AI创作助手写篇文章吧