2016-08-17 70 views
-1

這裏是我的代碼被用於一個字節數組傳遞給串 但它失敗:如何在Golang中將[4]字節{1,2,3,4}轉換爲「1.2.3.4」?

package main 

import (
    "bytes" 
    "fmt" 
) 

type IPAddr [4]byte 

// TODO: Add a "String() string" method to IPAddr. 

func (ip IPAddr) String() string { 
    s := [][]byte{ip[:]} 
    //fmt.Println(s) 
    sep := []byte(".") 
    return string(bytes.Join(s, sep)) 
} 

func main() { 
    hosts := map[string]IPAddr{ 
     "loopback": {127, 0, 0, 1}, 
     "googleDNS": {8, 8, 8, 8}, 
    } 
    for name, ip := range hosts { 
     fmt.Printf("%v: %v\n", name, ip) 
    } 
} 

程序不會產生預期的輸出爲

loopback: 127.0.0.1 
googleDNS: 8.8.8.8 

如何變換[4 ]在Golang中將字節{1,2,3,4}改爲「1.2.3.4」?

+1

http://stackoverflow.com/questions/33418107/why-cant-i-do-fmt- sprintfd-DDDA – shaidiren

+0

我發現在計算器同樣的問題: http://stackoverflow.com/questions/33418107/why-cant-i-do-fmt-sprintfd-ddda 但如果有其他的方式來直接調用 – shaidiren

+0

請參閱https: //golang.org/src/net/ip.go#L260 –

回答

2

您不需要定義自己的類型,因爲已經有net.IP實施fmt.Stringer

例子:

package main 

import (
    "fmt" 
    "net" 
) 

func main() { 
    ip := net.IP{127, 0, 0, 1} 
    fmt.Println(ip) 
} 

net.IP是一個字節的片,所以你也可以這樣做:

b := []byte{127, 0, 0, 1} 
ip := net.IP(b) 
fmt.Println(ip) 
1

1-使用net.IP,像這樣的工作示例代碼:

package main 

import "fmt" 
import "net" 

func main() { 
    hosts := map[string]net.IP{ 
     "loopback ": {127, 0, 0, 1}, 
     "googleDNS": {8, 8, 8, 8}, 
    } 
    for name, ip := range hosts { 
     fmt.Println(name, ":", ip) 
    } 
} 

輸出:

loopback : 127.0.0.1 
googleDNS : 8.8.8.8 

2-使用此:

func (ip IPAddr) String() string { 
    return strconv.Itoa(int(ip[0])) + "." + 
     strconv.Itoa(int(ip[1])) + "." + 
     strconv.Itoa(int(ip[2])) + "." + 
     strconv.Itoa(int(ip[3])) 
} 

這樣工作的示例代碼:

package main 

import "fmt" 
import "strconv" 

type IPAddr [4]byte 

func (ip IPAddr) String() string { 
    return strconv.Itoa(int(ip[0])) + "." + 
     strconv.Itoa(int(ip[1])) + "." + 
     strconv.Itoa(int(ip[2])) + "." + 
     strconv.Itoa(int(ip[3])) 
} 

func main() { 
    hosts := map[string]IPAddr{ 
     "loopback ": {127, 0, 0, 1}, 
     "googleDNS": {8, 8, 8, 8}, 
    } 
    for name, ip := range hosts { 
     fmt.Println(name, ":", ip) 
    } 
} 

輸出:

loopback : 127.0.0.1 
googleDNS : 8.8.8.8 

3-使用strings.Trim(strings.Join(strings.Fields(fmt.Sprint(ip)), "."), "[]")
這樣工作的示例代碼:

package main 

import "fmt" 
import "strings" 

type IPAddr [4]byte 

func (ip IPAddr) String() string { 
    return strings.Trim(strings.Join(strings.Fields(fmt.Sprint([4]byte(ip))), "."), "[]") 
} 

func main() { 
    hosts := map[string]IPAddr{ 
     "loopback ": {127, 0, 0, 1}, 
     "googleDNS": {8, 8, 8, 8}, 
    } 
    for name, ip := range hosts { 
     fmt.Println(name, ":", ip) 
    } 
} 

輸出:

loopback : 127.0.0.1 
googleDNS : 8.8.8.8 
+0

非常感謝! – shaidiren

+0

@shaidiren不客氣。 – 2016-08-18 03:11:28