Получить исходное значение из настраиваемого строкового типа - PullRequest
0 голосов
/ 09 июля 2020
package main

import (
    "fmt"
    "strings"
)

type AssetID string

func main() {
    p := AssetID("photo")
    fmt.Printf("%s\n", p)
    fmt.Printf("%q\n", p)
    fmt.Printf("%v\n", p)
    fmt.Printf("%+v\n", p)
    fmt.Printf("%#v\n", p)
    fmt.Println(strings.Trim(fmt.Sprintf("%#v", p), `"`))
}

func (aid AssetID) String() string {
    switch aid {
    case "photo":
        return "Photos!"
    default:
        return "Unknown asset ID"
    }
}

(источник: https://play.golang.org/p/YU70wWtws4N)

Я использую эти AssetID в своей настройке html/template. Но проблема возникает, когда я хочу превратить []AssetID в оператор HTML <select>.

Что я хочу:

<select>
<option value="photo">Photos!</option>
</select>

Что я получаю (без специального материала printf в примере выше.):

<select>
<option value="Photos!">Photos!</option>
</select>

Есть ли другой способ исправить это?

Изменить: дополнительная информация; Я хотел бы иметь оба, и я хотел, чтобы в идеале функциональность Stringer работала, чтобы я мог использовать //go generate stringer. Я согласен с тем, что ответ будет; на самом деле это невозможно.

1 Ответ

2 голосов
/ 09 июля 2020

Проблема в том, что вы (очевидно, случайно) реализуете интерфейс fmt.Stringer, который fmt.Sprintf использует для форматирования значения.

Добавляя функцию с подписью String() string для вашего типа, вы говорите fmt.Sprintf вызвать эту функцию для ее форматирования.

Самый простой способ решить вашу проблему - это переименовать вашу функцию во что-то другое. Возможно:

func (aid AssetID) Description() string {
    switch aid {
    case "photo":
        return "Photos!"
    default:
        return "Unknown asset ID"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...