Golang 檢查 IPv6 是否合法

以前都用 regular expression 檢查 IPv4 是否合法,那 IPv6 難道也得這樣做?沒有更方便的處理方式嗎?

1. 環境 Environment

  • macOS 12.5.1
  • go v1.18

2. Regular expression 檢查 IPv4

以前我是這樣用,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"regexp"
)

func main() {
t1 := MatchIPv4("10.40.210.253")
f1 := MatchIPv4("1000.40.210.253")
fmt.Println(t1)
fmt.Println(f1)
// Output:
// true
// false
}

func MatchIPv4(s string) bool {
re, _ := regexp.Compile(`^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$`)
return re.MatchString(s)
}

3. 用 net.ParseIP 檢查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import (
"fmt"
"net"
)

func main() {
t1 := ValidIPv4("10.40.210.253")
f1 := ValidIPv4("1000.40.210.253")
t2 := ValidIPv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
f2 := ValidIPv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334:3445")
fmt.Println(t1)
fmt.Println(f1)
fmt.Println(t2)
fmt.Println(f2)
// Output:
// true
// false
// true
// fasle
}

func ValidIPv4(ip string) bool {
if net.ParseIP(ip).To4() != nil {
return true
}
return false
}

func ValidIPv6(ip string) bool {
if net.ParseIP(ip).To16() != nil {
return true
}
return false
}

Ref: Check if an IP address is IPV4 or IPV6 in Go