Go語言:判斷IP是否合法是IPv4還是IPv6

net.IP的ParseIP函數判斷IPv4/IPv6的依據就是是否出現".”或者":",因爲返回的net.IP都是16字節,而且IPv4前面加了::ffff所以根據返回的IP是不太好判斷輸入的原始字符串是IPv4還是IPv6。所以得自己寫,代碼如下:

package main

import (
	"fmt"
	"net"
)

// 0: invalid ip
// 4: IPv4
// 6: IPv6
func ParseIP(s string) (net.IP, int) {
	ip := net.ParseIP(s)
	if ip == nil {
		return nil, 0
	}
	for i := 0; i < len(s); i++ {
		switch s[i] {
		case '.':
			return ip, 4
		case ':':
			return ip, 6
		}
	}
	return nil, 0
}

func test(s string) {
	ip, n := ParseIP(s)
	fmt.Printf("%v %v\n", n, ip)
}
func main() {
	test("127.0.0.1")
	test("::127.0.0.1")
	test("2001:0:53ab:0:0:0:0:0")
	test("2001:0:c38c:ffff:ffff:0000:0000:ffff")
	test("2001:0:c38c:ffff:ffff::")
	test("327.0.0.1")
	test("2001:0:c38c:ffff:ffff:ffff:ffff:ffff1")
}

輸出:

4 127.0.0.1
6 ::7f00:1
6 2001:0:53ab::
6 2001:0:c38c:ffff:ffff::ffff
6 2001:0:c38c:ffff:ffff::
0 <nil>
0 <nil>

net.IP源碼:

func ParseIP(s string) IP {
	for i := 0; i < len(s); i++ {
		switch s[i] {
		case '.':
			return parseIPv4(s)
		case ':':
			return parseIPv6(s)
		}
	}
	return nil
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章