我有这段代码:// redacted var ( cidr net.IPNet createCmd = &cobra.Command{ Use: "create", Short: "create would create something useful", Long: "create submits a request for something useful creation based on parameters provided ", Run: func(cmd *cobra.Command, args []string) { //region comes from rootCmd log.Infof("cidr: %v, ipmask: %v", cidr, cidr.IP.DefaultMask()) }, } )func init() { createCmd.Flags().IPNetVar(&cidr, "vpc-cidr", cidr, "Vpc cidr range")}// redacted输出:./somethinguseful create --cidr 192.168.100.0/24INFO[0000] cidr: {192.168.100.0 ffffff00}, ipmask: ffffff00我无法理解命令行参数 192.168.100.0/24 在哪个阶段被转换为 net.IP 和掩码。查看IPNet代码func newIPNetValue(val net.IPNet, p *net.IPNet) *ipNetValue { *p = val return (*ipNetValue)(p) }// allocates default to pointer to net.IPNet if provided没有任何代码可以将输入转换为显示的输出。如何根据 cidr 块的输入计算并打印掩码值。请任何指点。
1 回答
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
好吧,这在根上用作标志,而标志需要flag.Value接口。该接口所需要的只是它是 aStringer
并且它实现了Set(string) error
。
ipNetValue
正是这样做的
func (ipnet ipNetValue) String() string {
n := net.IPNet(ipnet)
return n.String()
}
func (ipnet *ipNetValue) Set(value string) error {
_, n, err := net.ParseCIDR(strings.TrimSpace(value))
if err != nil {
return err
}
*ipnet = ipNetValue(*n)
return nil
}
- 1 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消