webentwicklung-frage-antwort-db.com.de

Wie kann man eine Zeichenfolge teilen und Variablen in Golang zuweisen?

In Python ist es möglich, einen String zu teilen und Variablen zuzuweisen:

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 kann man eine Zeichenfolge teilen und Werte in einem Schritt zuweisen?

108
Pyt

Zwei Schritte zum Beispiel

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

Ausgabe:

127.0.0.1 5432

Ein Schritt zum Beispiel

package main

import (
    "fmt"
    "net"
)

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

Ausgabe:

127.0.0.1 5432 <nil>
182
peterSO

Da go flexibel ist, können Sie Ihren eigenen python-Stil-Split erstellen ... 

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
}
17
Baba

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

net.SplitHostPort funktioniert also super:

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>
5
Glenn McElhoe
package main

import (
    "fmt"
    "strings"
)

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

Hier ist die Definition für Strings.Split

// Split slices s into all substrings separated by sep and returns a slice of
// the substrings between those separators.
//
// If s does not contain sep and sep is not empty, Split returns a
// slice of length 1 whose only element is s.
//
// If sep is empty, Split splits after each UTF-8 sequence. If both s
// and sep are empty, Split returns an empty slice.
//
// It is equivalent to SplitN with a count of -1.
func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }
1
Prabesh P

Golang unterstützt nicht das implizite Entpacken eines Slice (im Gegensatz zu Python) und aus diesem Grund würde dies nicht funktionieren. Wie in den obigen Beispielen müssten wir es umgehen.

Eine Randnotiz:

Das implizite Entpacken geschieht für verschiedene Funktionen in go:

func varParamFunc (params ... int) {

}

varParamFunc (slice1 ...)

0

Es gibt mehrere Möglichkeiten, eine Zeichenfolge zu teilen:

  1. Wenn Sie es temporär machen möchten, teilen Sie es wie folgt auf:

_

import net package

Host, port, err := net.SplitHostPort("0.0.0.1:8080")
if err != nil {
fmt.Println("Error is splitting : "+err.error());
//do you code here
}
fmt.Println(Host, port)
  1. Split basierend auf struct:

    • Erstellen Sie eine Struktur und teilen Sie diese auf

_

type ServerDetail struct {
    Host       string
    Port       string
    err        error
}

ServerDetail = net.SplitHostPort("0.0.0.1:8080") //Specific for Host and Port

Verwenden Sie nun Code wie ServerDetail.Host und ServerDetail.Port in Ihrem Code.

Wenn Sie keine bestimmte Zeichenfolge aufteilen möchten, gehen Sie folgendermaßen vor:

type ServerDetail struct {
    Host       string
    Port       string
}

ServerDetail = strings.Split([Your_String], ":") // Common split method

und wie ServerDetail.Host und ServerDetail.Port verwenden.

Das ist alles.

0
amku91

Sie akzeptieren eine geteilte Antwort in zwei verschiedene Variablen, und strings.Split () gibt nur eine Antwort zurück, und das ist ein Array von Zeichenfolgen. Sie müssen es in einer einzelnen Variablen speichern und dann können Sie den Teil der Zeichenfolge extrahieren, indem Sie den Indexwert eines Arrays abrufen.

beispiel:

var hostAndPort String
hostAndPort = "127.0.0.1:8080"
sArray := strings.Split(hostAndPort, ":")
fmt.Println("Host : " + sArray[0])
fmt.Println("port : " + sArray[1])
0
Hardik Bohra