将 CIDR 块转换为 net.IP 类型

我有这段代码:


// 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/24

INFO[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 块的输入计算并打印掩码值。请任何指点。


慕工程0101907
浏览 229回答 1
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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go