Cara membagi string dan menetapkannya ke variabel

151

Dengan Python dimungkinkan untuk membagi string dan menetapkannya ke variabel:

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

tetapi di Go tampaknya tidak berfungsi:

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

Pertanyaan: Bagaimana cara membagi string dan menetapkan nilai dalam satu langkah?

Pyt
sumber
2
splittedString: = strings.Split("127.0.0.1:5432", ":")Ans: = splittedString[index]Anda dapat mengakses Nilai String yang
dipisah

Jawaban:

249

Dua langkah, misalnya,

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

Keluaran:

127.0.0.1 5432

Satu langkah, misalnya,

package main

import (
    "fmt"
    "net"
)

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

Keluaran:

127.0.0.1 5432 <nil>
peterSO
sumber
Ini membagi string menjadi daftar string, bukan daftar karakter.
dopatraman
4
Apa yang terjadi jika kita mendapatkan alamat IPv6?
PumpkinSeed
@PumpkinSeed baru saja mencobanya, dan saya mendapatkan ini dari err, sayangnya: too many colons in address 2001:0db8:85a3:0000:0000:8a2e:0370:7334:(
JM Janzen
21

Karena gofleksibel dan Anda dapat membuat pythongaya ...

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
sumber
1
ini lebih dari sedikit berbeda dengan python. bagaimana Anda membuat versi variable-return-count?
Groxx
15
Saya suka Go tetapi saya tidak akan menyebut ini fleksibel : D
Pijusn
7

Alamat IPv6 untuk bidang seperti RemoteAddrdari http.Requestdiformat sebagai "[:: 1]: 53343"

Sangat net.SplitHostPortbagus:

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

Output adalah:

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

Berikut adalah definisi untuk string

// 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
sumber
di sini ada kesalahan "./prog.go:12:17: undefined: str"
Anshu
1

Ada beberapa cara untuk membagi string:

  1. Jika Anda ingin menjadikannya sementara maka bagi seperti ini:

_

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 berdasarkan struct:

    • Buat struct dan split seperti ini

_

type ServerDetail struct {
    Host       string
    Port       string
    err        error
}

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

Sekarang gunakan kode seperti Anda ServerDetail.HostdanServerDetail.Port

Jika Anda tidak ingin membagi string tertentu lakukan seperti ini:

type ServerDetail struct {
    Host       string
    Port       string
}

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

dan gunakan like ServerDetail.Hostdan ServerDetail.Port.

Itu saja.

amku91
sumber
Bentuk struct tidak berfungsi:./prog.go:21:4: assignment mismatch: 1 variable but net.SplitHostPort returns 3 values
E. Anderson
1

Apa yang Anda lakukan adalah, Anda menerima respons terbagi dalam dua variabel yang berbeda, dan strings.Split () mengembalikan hanya satu respons dan itu adalah array string. Anda perlu menyimpannya ke variabel tunggal dan kemudian Anda dapat mengekstraksi bagian string dengan mengambil nilai indeks array.

contoh:

 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
sumber
1

Sebagai catatan tambahan, Anda dapat memasukkan pemisah sambil memisahkan string di Go. Untuk melakukannya, gunakan strings.SplitAfterseperti pada contoh di bawah ini.

package main

import (
    "fmt"
    "strings"
)

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

Golang tidak mendukung pembongkaran implisit slice (tidak seperti python) dan itulah alasan ini tidak akan berhasil. Seperti contoh yang diberikan di atas, kita perlu mengatasinya.

Catatan satu sisi:

Pembongkaran implisit terjadi untuk fungsi variadic di mana saja:

func varParamFunc(params ...int) {

}

varParamFunc(slice1...)
sobat
sumber