在本文中,我们将了解如何将简单的对比Java和Go是如何将字符串解析为IP地址。
Java
在Java中,将字符串转换为IP地址最无脑的一个方法:
import java.net.InetAddress;
import java.net.UnknownHostException;public class Main {public static void main(String[] args) {String ipString = "192.168.1.1";try {InetAddress ipAddress = InetAddress.getByName(ipString);System.out.println("IP地址:" + ipAddress.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}
}
IPv6一个道理
import java.net.InetAddress;
import java.net.UnknownHostException;public class Main {public static void main(String[] args) {String ipString = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";try {InetAddress ipAddress = InetAddress.getByName(ipString);System.out.println("IP地址:" + ipAddress.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}
}
Go
接下来让我们看一下Go语言的net.Addr类型
type Addr interface {Network() string // name of the network (for example, "tcp", "udp")String() // string form of address (for example, "192.0.2.1:25", "[2001:db8::1]:80") }
net.Addr 只是一个接口,因此任何满足此接口的类型都是有效的 IP地址
- net.TCPAddr
- net.UDPAddr
- net.IPAddr
上述类型都实现了 net.Addr 接口,因为它们具有Network和String方法。如果您注意到的话,所有这些类型都有一个将字符串解析为其具体类型的函数。对于net.UDPAddr,我们有net.ResolveUDPAddr,对于net.TCPAddr,我们有net.ResolveTCPAddr,对于net.IPAddr,我们有net.ResolveIPAddr
解析成net.TCPAddr
通过使用net.TCPAddr标准库中的函数,net.ResolveTCPAddr如下所示
func ResolveTCPAddr(network, address string) *TCPAddr, error
来看看例子
package mainimport ("fmt""net"
)func main() {addr, err := net.ResolveTCPAddr("tcp", "1.1.1.1:1234")if err != nil {panic(err)}fmt.Println("Addr", addr.String())
}
解析成net.UDPAddr
和TCP一个道理,这里使用net.UDPAddr标准库中的函数,net.ResolveUDPAddr如下所示
func ResolveUDPAddr(network, address string) *UDPAddr, error
代码如下
package mainimport ("fmt""net"
)func main() {addr, err := net.ResolveUDPAddr("tcp", "1.1.1.1:53")if err != nil {panic(err)}fmt.Println("Addr", addr.String())
}
解析成net.IPAddr
通过使用net.IPAddr标准库中的函数net.ResolveIPAddr如下所示
func ResolveIPAddr(network, address string) *IPAddr, error
package mainimport ("fmt""net"
)func main() {addr, err := net.ResolveIPAddr("ip", "1.1.1.1")if err != nil {panic(err)}fmt.Println("Addr", addr.String())
}
总结
总体而言,两种语言的实现都比较简单直观,主要区别在于错误处理方式和具体的 API 使用。