2013-05-14 5 views
62

In Python ist es möglich, einen String und weisen es Variablen aufteilen:Wie teilt man einen String auf und weist ihn Variablen in Golang zu?

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

aber in Golang scheint es nicht zu funktionieren:

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

Frage: Wie eine Zeichenfolge aufteilen und Werte in einem Schritt zuweisen?

Antwort

116

Zwei Schritte, beispielsweise

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

Output:

127.0.0.1 5432 

ein Schritt, beispielsweise

package main 

import (
    "fmt" 
    "net" 
) 

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

Output:

127.0.0.1 5432 <nil> 
+0

Dies teilt eine Zeichenfolge in eine Liste von Zeichenfolgen, keine Liste von Zeichen. – dopatraman

+4

Was passiert, wenn wir eine IPv6-Adresse bekommen? – PumpkinSeed

+0

@PumpkinSeed habe es gerade ausprobiert, und ich bekomme das von 'err' zurück, leider:' zu viele Doppelpunkte in der Adresse 2001: 0db8: 85a3: 0000: 0000: 8a2e: 0370: 7334' :( –

17

Da go ist flexibel ein Sie können Ihre eigenen python Stil Split ...

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

das ist mehr als ein etwas anders als das Python-Äquivalent: Wie würdest du eine Variable-Return-Count-Version machen? – Groxx

+3

Ich mag Go, aber ich würde das nicht _flexible_ nennen: D – Pijusn

1

Die IPv6-Adressen für Felder wie RemoteAddr von http.Request formatiert als "[:: 1]: 53343" erstellen

so funktioniert net.SplitHostPort groß:

Paket Haupt

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

Ausgabe ist:

127.0.0.1 5432 <nil> 
::1 2345 <nil> 
localhost 1234 <nil> 
Verwandte Themen