code: func (e *Entry) String() string {
  	switch e.SetType {
  	case HashIPPort:
  		// Entry{192.168.1.1, udp, 53} -> 192.168.1.1,udp:53
  		// Entry{192.168.1.2, tcp, 8080} -> 192.168.1.2,tcp:8080
  		return fmt.Sprintf("%s,%s:%s", e.IP, e.Protocol, strconv.Itoa(e.Port))
  	case HashIPPortIP:
  		// Entry{192.168.1.1, udp, 53, 10.0.0.1} -> 192.168.1.1,udp:53,10.0.0.1
  		// Entry{192.168.1.2, tcp, 8080, 192.168.1.2} -> 192.168.1.2,tcp:8080,192.168.1.2
  		return fmt.Sprintf("%s,%s:%s,%s", e.IP, e.Protocol, strconv.Itoa(e.Port), e.IP2)
  	case HashIPPortNet:
  		// Entry{192.168.1.2, udp, 80, 10.0.1.0/24} -> 192.168.1.2,udp:80,10.0.1.0/24
  		// Entry{192.168.2,25, tcp, 8080, 10.1.0.0/16} -> 192.168.2,25,tcp:8080,10.1.0.0/16
  		return fmt.Sprintf("%s,%s:%s,%s", e.IP, e.Protocol, strconv.Itoa(e.Port), e.Net)
  	case BitmapPort:
  		// Entry{53} -> 53
  		// Entry{8080} -> 8080
  		return strconv.Itoa(e.Port)
  	}
  	return ""
  }
docs: // String returns the string format for ipset entry.