3

次のような構造体があります。

type MyStruct struct {
   Part1 string
   Part2 string
   Part3 string
}

これにマップしたいスラッシュで区切られた文字列があります:

part1/part2/part3

ただし、文字列には、part1 のように 1 つの部分のみ、または part1/part2 のように 2 つの部分のみが含まれる場合があります。

一部が欠落している場合は、空の文字列としてマップされます。

私は非常に新しいので、これを達成するための最良の方法は何だろうと思っています。通常、私は文字列を分割し、長さをチェックして何をすべきかを知ります。これを行うためのよりエレガントな方法はありますか?

4

4 に答える 4

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

これら2つの理由でバイパスしたため、構文を短くし、型の名前を変更して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 に答える