web-dev-qa-db-fra.com

Comment diviser une chaîne et l'affecter à des variables dans Golang?

En Python, il est possible de scinder une chaîne et de l’affecter à des variables:

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

mais à Golang, cela ne semble pas fonctionner:

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

Question: Comment diviser une chaîne et attribuer des valeurs en une étape?

108
Pyt

Deux étapes, par exemple

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

Sortie:

127.0.0.1 5432

Une étape, par exemple,

package main

import (
    "fmt"
    "net"
)

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

Sortie:

127.0.0.1 5432 <nil>
182
peterSO

Puisque go est flexible, vous pouvez créer votre propre division de style 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
}
17
Baba

Les adresses IPv6 des champs tels que RemoteAddr à partir de http.Request sont au format "[:: 1]: 53343".

Donc, net.SplitHostPort fonctionne très bien:

paquet principal

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

La sortie est:

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

Voici la définition de 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 ne prend pas en charge le déballage implicite d’une tranche (contrairement à Python) et c’est la raison pour laquelle cela ne fonctionnerait pas. Comme les exemples donnés ci-dessus, nous aurions besoin de contourner le problème.

Un côté note:

La décompression implicite se produit pour les fonctions variadiques dans go:

func varParamFunc (params ... int) {

}

varParamFunc (slice1 ...)

0

Il existe plusieurs façons de fractionner une chaîne:

  1. Si vous voulez le rendre temporaire, divisez-vous comme ceci:

_

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 basé sur struct:

    • Créer une structure et diviser comme ceci

_

type ServerDetail struct {
    Host       string
    Port       string
    err        error
}

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

Maintenant, utilisez dans votre code comme ServerDetail.Host et ServerDetail.Port

Si vous ne souhaitez pas scinder une chaîne spécifique, procédez comme suit:

type ServerDetail struct {
    Host       string
    Port       string
}

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

et utiliser comme ServerDetail.Host et ServerDetail.Port.

C'est tout.

0
amku91

Ce que vous faites est que vous acceptez une réponse fractionnée dans deux variables différentes et que strings.Split () ne renvoie qu'une seule réponse, à savoir un tableau de chaînes. vous devez le stocker dans une variable unique et ensuite vous pouvez extraire la partie de chaîne en récupérant la valeur d'index d'un tableau.

exemple :

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