たのしい駆動開発

たのしいアウトプットの場所

Go言語で自分のIPv4アドレス,サブネットマスク,ネットワークアドレスを求める

ドーモ。えりくべです。
現在私はメルカリさんが主催している「Step up Go for Students - ゼロから海外カンファレンスを目指そう」という、Goでソフトウェアをつくって、それをコードレビューしてもらえるというすごいものに参加しています。

mercari.connpass.com (第2回からでも参加できるようなのでご興味がある方は是非)

そのソフトウェアを作る際に、IPアドレスを求める必要があったので、実際に書いてみました。
コメントアウトから適宜読み取っていただけると幸いです。

// IPv4アドレスを求めるプログラム
package main

import (
    "fmt"
    "net"
)

func main() {
    // すべてのアドレスを取得
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        fmt.Println("cannot get address.")
        return
    }

    // 表示
    for i, addrs := range addrs {
        fmt.Printf("%d:%s\n", i+1, addrs.String())
    }
    fmt.Println()
    fmt.Println("----------------------------")
    fmt.Println()

    var ipv4 net.IP
    // IPv4アドレスを取得
    for _, a := range addrs {
        ipnet, ok := a.(*net.IPNet)
        // ipnetが真で、ループバックアドレスを除外
        if ok && !ipnet.IP.IsLoopback() {
            //IPv4に変換できるとき
            if ipnet.IP.To4() != nil {
                fmt.Printf("IPv4 address:%s\n", ipnet.IP.String())
                ipv4 = ipnet.IP
            }
        }
    }

    // ipv4からサブネットマスク値を求める
    mask := ipv4.DefaultMask()
    fmt.Println("subnet mask:", mask)
    //maskを使って、ipv4をマスクして、ネットワークアドレスに変える
    netIPv4 := ipv4.Mask(mask)
    fmt.Println("network address:", netIPv4)
}




実行結果

1:127.0.0.1/8
2:::1/128
3:fe80::1/64
4:fe80::1888:1970:c3cc:850d/64
5:192.168.11.4/24
6:fe80::1c14:a1ff:fe53:5fe/64
7:fe80::bf48:51ad:da48:d2cc/64

----------------------------

IPv4 address:192.168.11.4
subnet mask: ffffff00
network address: 192.168.11.0