英文:
Why go writes 000/s instead of string?
问题
由于某些原因,Go将字符串编码为字节,我想知道这是否是Go的一个错误。请参考下面的代码:
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存储库(redhat)运行Go。我还创建了一个类似的代码片段,返回类似的结果。
[为我播放!][1]
[1]: http://play.golang.org/p/JbbbfK3whZ
英文:
For some reasons go encodes the string like bytes and I'm wondering if it's a go bug. See the code below:
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))
It prints:
{"Ip":"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ufffd\ufffd\ufffd\ufffd\u0007+"}
I'm running Go from epel repository ( redhat ). I also made a snippet which returns similar results.
[Play it for me!][1]
[1]: http://play.golang.org/p/JbbbfK3whZ
答案1
得分: 3
这是因为你将一系列的IP地址字节视为原始字符串。
net.ParseCIDR
返回的 net.IP
值有一个 .String()
方法,你应该调用它,而不是使用 string(ip)
。
尝试使用 这个 代码:
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("无法解析CIDR %s,错误:%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("错误:", err)
}
fmt.Println(string(b))
}
英文:
This happens because you are treating a sequence of IP address bytes as a raw string.
The net.IP
value returned by net.ParseCIDR
has a .String()
method you should call, instead of doing string(ip)
.
Try this instead:
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))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论