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?


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>

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
}

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>

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

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.


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

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

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...)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.