Como dividir uma string e atribuí-la a variáveis

151

No Python, é possível dividir uma string e atribuí-la a variáveis:

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

mas no Go não parece funcionar:

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

Pergunta: Como dividir uma string e atribuir valores em uma etapa?

Pyt
fonte
2
splittedString: = strings.Split("127.0.0.1:5432", ":")Ans: = splittedString[index]você pode acessar o valor da corda dividida
Muthukumar selvaraj

Respostas:

249

Duas etapas, por exemplo,

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

Resultado:

127.0.0.1 5432

Um passo, por exemplo,

package main

import (
    "fmt"
    "net"
)

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

Resultado:

127.0.0.1 5432 <nil>
peterSO
fonte
Isso divide uma string em uma lista de strings, não em uma lista de caracteres.
Dopatraman 27/05
4
O que acontece se obtivermos um endereço IPv6?
precisa saber é o seguinte
@PumpkinSeed acabou de experimentar, e eu recebo isso de volta err , infelizmente: too many colons in address 2001:0db8:85a3:0000:0000:8a2e:0370:7334:(
JM Janzen
21

Como goé flexível, você pode criar sua própria pythondivisão de estilo ...

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
}
Baba
fonte
1
isso é mais do que um pouco diferente do equivalente em python. como você criaria uma versão de contagem de retorno variável?
Groxx
15
Gosto de Go, mas não chamaria isso de flexível : D
Pijusn 25/05
7

Os endereços IPv6 para campos como RemoteAddrdehttp.Request são formatados como "[:: 1]: 53343"

Então, net.SplitHostPortfunciona muito bem:

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

A saída é:

127.0.0.1 5432 <nil>
::1 2345 <nil>
localhost 1234 <nil>
Glenn McElhoe
fonte
2
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)
}

Aqui está a definição para strings.

// 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) }
Prabesh P
fonte
aqui está um erro "./prog.go:12:17: undefined: str"
Anshu
1

Existem várias maneiras de dividir uma string:

  1. Se você quiser torná-lo temporário, divida da seguinte forma:

_

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. Dividir com base em struct:

    • Crie uma estrutura e divida como esta

_

type ServerDetail struct {
    Host       string
    Port       string
    err        error
}

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

Agora use em seu código como ServerDetail.HosteServerDetail.Port

Se você não deseja dividir uma sequência específica, faça o seguinte:

type ServerDetail struct {
    Host       string
    Port       string
}

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

e use como ServerDetail.Hoste ServerDetail.Port.

Isso é tudo.

amku91
fonte
O formulário struct não funciona:./prog.go:21:4: assignment mismatch: 1 variable but net.SplitHostPort returns 3 values
E. Anderson
1

O que você está fazendo é que você está aceitando resposta dividida em duas variáveis ​​diferentes, e strings.Split () está retornando apenas uma resposta e essa é uma matriz de strings. você precisa armazená-lo na única variável e, em seguida, pode extrair a parte da string buscando o valor do índice de uma matriz.

exemplo:

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

Como observação lateral, você pode incluir os separadores enquanto divide a sequência em Ir. Para fazer isso, use strings.SplitAftercomo no exemplo abaixo.

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Printf("%q\n", strings.SplitAfter("z,o,r,r,o", ","))
}
monkrus
fonte
0

Golang não suporta descompactação implícita de uma fatia (ao contrário do python) e é por isso que isso não funcionaria. Como os exemplos dados acima, precisaríamos contorná-lo.

Uma nota lateral:

A descompactação implícita acontece para funções variadas em go:

func varParamFunc(params ...int) {

}

varParamFunc(slice1...)
pr-pal
fonte