2013-05-14 12 views
62

W Pythonie możliwe jest, aby podzielić ciąg i przypisać go do zmiennych:Jak podzielić ciąg i przypisać go do zmiennych w Golang?

ip, port = '127.0.0.1:5432'.split(':') 

ale w Golang nie wydaje się działać:

ip, port := strings.Split("127.0.0.1:5432", ":") 
// assignment count mismatch: 2 = 1 

Pytanie: Jak podzielić ciąg i przypisać wartości w jednym kroku?

Odpowiedz

116

dwóch etapach, na przykład

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    s := strings.Split("127.0.0.1:5432", ":") 
    ip, port := s[0], s[1] 
    fmt.Println(ip, port) 
} 

wyjściowa:

127.0.0.1 5432 

jednym etapie, na przykład,

package main 

import (
    "fmt" 
    "net" 
) 

func main() { 
    host, port, err := net.SplitHostPort("127.0.0.1:5432") 
    fmt.Println(host, port, err) 
} 

wyjściowa:

127.0.0.1 5432 <nil> 
+0

Dzieli to łańcuch na listę ciągów znaków, a nie na listę znaków. – dopatraman

+4

Co stanie się, gdy otrzymamy adres IPv6? – PumpkinSeed

+0

@PumpkinSeed właśnie wypróbował to i otrzymuję to z powrotem od 'err', niestety:' zbyt wiele dwukropek w adresie 2001: 0db8: 85a3: 0000: 0000: 8a2e: 0370: 7334' :( –

17

Od go jest elastyczny można stworzyć swój własny styl rozłamu python ...

package main 

import (
    "fmt" 
    "strings" 
    "errors" 
) 

type PyString string 

func main() { 
    var py PyString 
    py = "127.0.0.1:5432" 
    ip, port , err := py.Split(":")  // Python Style 
    fmt.Println(ip, port, err) 
} 

func (py PyString) Split(str string) (string, string , error) { 
    s := strings.Split(string(py), str) 
    if len(s) < 2 { 
     return "" , "", errors.New("Minimum match not found") 
    } 
    return s[0] , s[1] , nil 
} 
+0

to więcej niż niewiele różni się od odpowiednika Pythona, w jaki sposób stworzysz wersję o zmiennej liczbie zwrotów? – Groxx

+3

Lubię Go, ale nie nazwałbym tego _flexible_: D – Pijusn

1

Adresy IPv6 dla takich dziedzinach jak RemoteAddr od http.Request są sformatowane jako "[:: 1]: 53343"

więc net.SplitHostPort działa świetnie:

pakiet główny

import (
    "fmt" 
    "net" 
) 

func main() { 
    host1, port, err := net.SplitHostPort("127.0.0.1:5432") 
    fmt.Println(host1, port, err) 

    host2, port, err := net.SplitHostPort("[::1]:2345") 
    fmt.Println(host2, port, err) 

    host3, port, err := net.SplitHostPort("localhost:1234") 
    fmt.Println(host3, port, err) 
} 

Wyjście to:

127.0.0.1 5432 <nil> 
::1 2345 <nil> 
localhost 1234 <nil> 
Powiązane problemy