为什么要写000 / s而不是字符串?

时间:2014-06-09 09:53:18

标签: go

出于某些原因,将字符串编码为字节,我想知道它是否是一个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)。我还制作了一个返回类似结果的片段。

Play it for me!

1 个答案:

答案 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))
}