出于某些原因,将字符串编码为字节,我想知道它是否是一个go bug。请参阅以下代码:
ip, _, err := net.ParseCIDR(cidr)
if err!=nil{
log.Panicf("can't parse cidr %s, err was %v", cidr, err)
}
type Ip struct{
Ip string
}
ips := string(ip)
j:= Ip{
Ip: ips,
}
b, err := json.Marshal(j)
if err != nil {
log.Printf("error:", err)
}
fmt.Fprintln(w, string(b))
打印:
{"Ip":"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ufffd\ufffd\ufffd\ufffd\u0007+"}
我正在从epel存储库运行Go(redhat)。我还制作了一个返回类似结果的片段。
答案 0 :(得分:3)
这是因为您将IP地址字节序列视为原始字符串。
net.IP
返回的net.ParseCIDR
值包含您应该调用的.String()
方法,而不是string(ip)
。
请尝试this:
package main
import (
"encoding/json"
"fmt"
"log"
"net"
)
func main() {
cidr := "172.162.21.84/32"
ip, _, err := net.ParseCIDR(cidr)
if err != nil {
log.Panicf("can't parse cidr %s, err was %v", cidr, err)
}
type Ip struct {
Ip string
}
fmt.Printf("%T: %v\n", ip, ip)
j := Ip{
Ip: ip.String(),
}
b, err := json.Marshal(j)
if err != nil {
log.Printf("error:", err)
}
fmt.Println(string(b))
}