3

我有一个结构如下:

type MyStruct struct {
   Part1 string
   Part2 string
   Part3 string
}

我有一个用斜杠分隔的字符串,我想映射到这个:

part1/part2/part3

但是,字符串可能只包含 1 个部分,例如 part1 或两个部分,例如 part1/part2

如果缺少任何部分,则将其映射为空字符串。

我很新,所以想知道实现这一目标的最佳方法是什么。通常我会拆分字符串并检查长度以知道该怎么做。在 go 中是否有更优雅的方法来做到这一点?

4

4 回答 4

4

这是 peterSO 解决方案的一个版本,它使用包装器来帮助简化逻辑。

package main

import (
    "fmt"
    "strings"
)

type Wrap []string

func (w Wrap) Get(i int) string {
    if 0 <= i && i < len(w) {
        return w[i]
    }
    return ""
}

type MyStruct struct {
    Part1 string
    Part2 string
    Part3 string
}

func main() {
    str := "part1/part2/part3"
    split := Wrap(strings.Split(str, "/"))
    var parts MyStruct
    parts.Part1 = split.Get(0)
    parts.Part2 = split.Get(1)
    parts.Part3 = split.Get(2)
    fmt.Println(parts)

    str = "part1/part2"
    split = Wrap(strings.Split(str, "/"))
    parts = MyStruct{}
    parts.Part1 = split.Get(0)
    parts.Part2 = split.Get(1)
    parts.Part3 = split.Get(2)
    fmt.Println(parts)
}
于 2013-07-30T02:23:22.000 回答
4
package main

import (
    "fmt"
    "strings"
)

type MyStruct struct {
    Part1 string
    Part2 string
    Part3 string
}

func (m *MyStruct) set(s string) *MyStruct {
    p := []*string{&m.Part1, &m.Part2, &m.Part3}
    for i, v := range strings.Split(s+"//", "/")[:3] {
        *p[i] = v
    }
    return m
}

func main() {
    var v MyStruct
    fmt.Printf("%#v\n", v.set("foo"))
    fmt.Printf("%#v\n", v.set(""))
    fmt.Printf("%#v\n", v.set("bar/baz"))
    fmt.Printf("%#v\n", v.set("alpha//omega"))
    fmt.Printf("%#v\n", v.set("/var/mail"))
}

操场


输出:

&main.MyStruct{Part1:"foo", Part2:"", Part3:""}
&main.MyStruct{Part1:"", Part2:"", Part3:""}
&main.MyStruct{Part1:"bar", Part2:"baz", Part3:""}
&main.MyStruct{Part1:"alpha", Part2:"", Part3:"omega"}
&main.MyStruct{Part1:"", Part2:"var", Part3:"mail"}
于 2013-07-30T07:35:04.553 回答
1

例如,

package main

import (
    "fmt"
    "strings"
)

type MyStruct struct {
    Part1 string
    Part2 string
    Part3 string
}

func main() {
    str := "part1/part2/part3"
    split := strings.Split(str, "/")
    var parts MyStruct
    if len(split) > 0 {
        parts.Part1 = split[0]
        if len(split) > 1 {
            parts.Part2 = split[1]
            if len(split) > 2 {
                parts.Part3 = split[2]
            }
        }
    }
    fmt.Println(parts)
}

输出:

{part1 part2 part3}
于 2013-07-30T00:57:18.913 回答
0

由于这两个原因,当我绕过它时,用更短的语法和重命名的类型扩展 dyoo 的答案,但它是最可扩展和最可靠的解决方案。如果您需要将 3 个元素更改为 n 个元素,那么真正的好处就来了,所需要的只是更改您的结构定义和初始化。当字符串切片需要默认值时,StrSlice 类型也非常可重用。

package main

import (
    "fmt"
    "strings"
)

type MyStruct struct {
    Part1 string
    Part2 string
    Part3 string
}

type StrSlice []string

func (s StrSlice) Get(i int) string {
    if i >= 0 && i < len(s) {
        return s[i]
    }
    return ""
}

func main() {

    str := "part1/part2/part3"
    slice := StrSlice(strings.Split(str, "/"))
    parts := MyStruct{slice.Get(0),slice.Get(1),slice.Get(2)}
    fmt.Println(parts)

}
于 2014-06-13T13:36:54.497 回答