167 votes

Comment diviser une chaîne de caractères et l'affecter à des variables ?

En Python, il est possible de diviser une chaîne de caractères et de l'affecter à des variables :

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

mais dans Go, 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 de caractères et lui attribuer des valeurs en une seule étape ?

272voto

peterSO Points 25725

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>

21voto

Baba Points 49157

Depuis go est flexible et vous pouvez créer votre propre python style 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
}

9voto

Glenn McElhoe Points 179

Les adresses IPv6 pour les champs comme RemoteAddr de http.Request sont formatées comme "[::1]:53343".

Alors net.SplitHostPort fonctionne très bien :

package main

    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>

2voto

Prabesh P Points 140
package main

import (
    "fmt"
    "strings"
)

func main() {
    strs := strings.Split("127.0.0.1:5432", ":")
    ip := strs[0]
    port := strs[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) }

2voto

Golang ne supporte pas le déballage implicite d'un slice (contrairement à python) et c'est la raison pour laquelle cela ne fonctionnerait pas. Comme les exemples donnés ci-dessus, nous devrons contourner ce problème.

Une note complémentaire :

Le déballage implicite se produit pour les fonctions variadiques dans go :

func varParamFunc(params ...int) {

}

varParamFunc(slice1...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X