Làm thế nào để tách một chuỗi và gán nó cho các biến


151

Trong Python có thể tách một chuỗi và gán nó cho các biến:

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

nhưng trong Go nó dường như không hoạt động:

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

Câu hỏi: Làm thế nào để tách một chuỗi và gán giá trị trong một bước?


2
splittedString: = strings.Split("127.0.0.1:5432", ":")Ans: = splittedString[index]bạn có thể truy cập Giá trị của Chuỗi bị tách
muthukumar selvaraj

Câu trả lời:


249

Hai bước, ví dụ,

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

Đầu ra:

127.0.0.1 5432

Một bước, ví dụ,

package main

import (
    "fmt"
    "net"
)

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

Đầu ra:

127.0.0.1 5432 <nil>

Điều này phân tách một chuỗi thành một danh sách các chuỗi, không phải là một danh sách các ký tự.
dopatraman

4
Điều gì xảy ra nếu chúng tôi nhận được một địa chỉ IPv6?
PumpkinSeed 7/11/2016

@PumpkinSeed vừa dùng thử, và tôi lấy lại từ đây err, thật không may: too many colons in address 2001:0db8:85a3:0000:0000:8a2e:0370:7334:(
JM Janzen

21

golinh hoạt nên bạn có thể tạo sự pythonphân chia phong cách của riêng mình ...

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
điều này khác hơn một chút so với con trăn tương đương. Làm thế nào bạn có thể tạo ra một phiên bản đếm trở lại biến?
Groxx

15
Tôi thích Go nhưng tôi sẽ không gọi đây là linh hoạt : D
Pijusn

7

Địa chỉ IPv6 cho các trường như RemoteAddrtừ http.Requestđược định dạng là "[:: 1]: 53343"

Vì vậy, net.SplitHostPorthoạt động tuyệt vời:

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

Đầu ra là:

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

Đây là định nghĩa cho chuỗi.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) }

đây là một lỗi "./prog.go:12:17: không xác định: str"
Anshu

1

Có nhiều cách để tách một chuỗi:

  1. Nếu bạn muốn làm cho nó tạm thời thì chia như thế này:

_

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. Chia dựa trên struct:

    • Tạo một cấu trúc và phân chia như thế này

_

type ServerDetail struct {
    Host       string
    Port       string
    err        error
}

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

Bây giờ sử dụng trong mã của bạn như ServerDetail.HostServerDetail.Port

Nếu bạn không muốn tách chuỗi cụ thể, hãy làm như thế này:

type ServerDetail struct {
    Host       string
    Port       string
}

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

và sử dụng như ServerDetail.HostServerDetail.Port.

Đó là tất cả.


Dạng cấu trúc không hoạt động:./prog.go:21:4: assignment mismatch: 1 variable but net.SplitHostPort returns 3 values
E. Anderson

1

Những gì bạn đang làm là, bạn chấp nhận phản hồi phân tách theo hai biến khác nhau và chuỗi.Split () chỉ trả về một phản hồi và đó là một chuỗi các chuỗi. bạn cần lưu trữ nó vào một biến duy nhất và sau đó bạn có thể trích xuất một phần của chuỗi bằng cách tìm nạp giá trị chỉ mục của một mảng.

thí dụ :

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

1

Là một lưu ý phụ, bạn có thể bao gồm các dấu phân cách trong khi tách chuỗi trong Go. Để làm như vậy, sử dụng strings.SplitAfternhư trong ví dụ dưới đây.

package main

import (
    "fmt"
    "strings"
)

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

0

Golang không hỗ trợ giải nén ngầm một lát (không giống như trăn) và đó là lý do điều này sẽ không hoạt động. Giống như các ví dụ đã nêu ở trên, chúng ta sẽ cần phải giải quyết nó.

Lưu ý một mặt:

Việc giải nén ngầm xảy ra đối với các hàm matrixdic trong go:

func varParamFunc(params ...int) {

}

varParamFunc(slice1...)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.