Java与Go:字符串转IP

116 阅读2分钟

在本文中,我们将了解如何将简单的对比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 main

import (
 "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 main

import (
 "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 main

import (
 "fmt"
 "net"
)

func main() {
 addr, err := net.ResolveIPAddr("ip""1.1.1.1")
 if err != nil {
  panic(err)
 }
 fmt.Println("Addr", addr.String())
}

总结

总体而言,两种语言的实现都比较简单直观,主要区别在于错误处理方式和具体的 API 使用。