go - 将 CIDR block 转换为 net.IP 类型

标签 go networking

我有这段代码:

// 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 block 计算和打印掩码值。请任何指点。

最佳答案

好吧,这是在根目录中用作标志,并且标志需要 flag.Value界面。该接口(interface)所需要的只是它是一个Stringer。并且它实现了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
}

这将我们引向 https://golang.org/pkg/net/#ParseCIDR .

来源:https://golang.org/src/net/ip.go?s=16363:16407#L699

关于go - 将 CIDR block 转换为 net.IP 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58600784/

相关文章:

go - 如何从 Go 服务器在浏览器中下载文件

go - Go中的原型(prototype)结构

mysql - 本地 IP 与环回的数据库访问速度?

c - 网络程序可在Linux中运行,而不是在Cygwin下

go - 利用静态文件的浏览器缓存

go - 持续时间的时间单位

logging - 使用 io.Multiwriter 跨包/子包创建日志

html - 我们如何检查发送到电子邮件客户端的数据是否加密?

C++获取服务网络状态linux

php - 在 PHP 套接字编程中获取客户端 IP