2014-06-09 38 views
0

由於某些原因,將字符串編碼爲字節,我想知道它是否是一個錯誤。請參見下面的代碼:爲什麼要寫000/s而不是字符串?

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軟件庫(紅帽)運行圍棋。我也做了一個返回類似結果的片段。

Play it for me!

回答

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)) 
} 
+0

我怎麼知道?在goDoc上,我只能看到IP的類型是[]字節,所以我認爲它只是一個字節片段。 – user3721073

+0

它是一個字節片段。但是這些字節是文字IP地址八位字節。字節值「255」不會打印爲文字「255」字符串。該字符串將分別由3個字節組成,分別爲ASCII字符'2','5'和'5'。 – jimt

相關問題