Поиск соответствующего типа поля структуры для строки - PullRequest
0 голосов
/ 17 июня 2020

Вот код:

type OrderSide string

const (
    OrderSideSell OrderSide = "SELL"
    OrderSideBuy  OrderSide = "BUY"
)

type orderSides struct {
    Sell OrderSide
    Buy  OrderSide
}

var (
    OrderSides orderSides = orderSides{
        Sell: OrderSideSell,
        Buy:  OrderSideBuy,
    }
)

Теперь я хотел бы иметь возможность конвертировать между string и OrderSide (или еще лучше, полем OrderSides). Другими словами, учитывая string, содержащий либо "SELL", либо "BUY", как мне вернуть соответствующую константу OrderSide (или поле OrderSides.<>).

Чтобы было ясно, цель здесь заключается в том, чтобы делать это динамически, так что мне не нужно реализовывать гигантский переключатель, где я добавляю случаи, когда добавляю дополнительные поля OrderSide.

1 Ответ

1 голос
/ 17 июня 2020

Так как OrderSide - это просто псевдоним для строки, самый простой способ преобразовать строку в OrderSide: anOrderSide = OrderSide(aString).

Вот более длинный пример способов создания OrderSides или получения их из строковых переменных ( Go Площадка ):

type OrderSide string

func main() {
    var anOrderSide OrderSide
    anOrderSide = "def"

    fmt.Println(anOrderSide)
    fmt.Println(reflect.TypeOf(anOrderSide))

    var aString string
    var anotherOrderSide OrderSide

    aString = "abc"

    anotherOrderSide = OrderSide(aString)

    fmt.Println(aString)
    fmt.Println(reflect.TypeOf(aString))
    fmt.Println(anotherOrderSide)
    fmt.Println(reflect.TypeOf(anotherOrderSide))
}

Это не проверяет, является ли ваша строка допустимой OrderSide в соответствии с вашим «перечислением». Вам нужно будет убедиться, что строки находятся в списке допустимых OrderSides в другом месте. Простым способом было бы создать карту с ключами, являющимися всеми допустимыми строковыми значениями для OrderSides, а значениями - пустой структурой:

validOrderSides := make(map[string]struct{})

validOrderSides["BUY"] = struct{}{}
validOrderSides["SELL"] = struct{}{}

Затем вы можете просто проверить, находится ли строка, которую вы планируете преобразовать, в карта: _, ok := validOrderSides["BUY"].

Или, если хотите, вы можете сделать это map[string]OrderSide и преобразовать из строки в OrderSide и одновременно проверить: orderSide, isValid := stringToOrderSide["BUY"].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...