Czy istnieje prosty sposób sformatowania łańcucha w Go bez drukowania łańcucha?
Potrafię:
bar := "bar"
fmt.Printf("foo: %s", bar)
Ale chcę, aby sformatowany ciąg znaków został zwrócony, a nie wydrukowany, aby móc dalej nim manipulować.
Mógłbym również zrobić coś takiego:
s := "foo: " + bar
Ale staje się to trudne do odczytania, gdy łańcuch formatu jest złożony, i kłopotliwy, gdy jedna lub wiele części nie jest łańcuchami i trzeba je najpierw przekonwertować, jak
i := 25
s := "foo: " + strconv.Itoa(i)
Czy istnieje prostszy sposób na zrobienie tego?
string
go
formatting
string-formatting
Carnegie
źródło
źródło
1. Proste ciągi
W przypadku „prostych” ciągów znaków (zazwyczaj pasujących do linii) stosuje się najprostsze rozwiązanie
fmt.Sprintf()
i znajomych (fmt.Sprint()
,fmt.Sprintln()
). Są one analogiczne do funkcji bezS
litery początkowej , ale teSxxx()
warianty zwracają wynikstring
zamiast wypisywać je na standardowe wyjście.Na przykład:
Zmienna
s
zostanie zainicjowana wartością:Wskazówka: Jeśli chcesz po prostu połączyć wartości różnych typów, może nie być konieczne automatyczne użycie
Sprintf()
(co wymaga ciągu formatującego), jakSprint()
to dokładnie robi. Zobacz ten przykład:W przypadku łączenia tylko
string
możesz użyćstrings.Join()
miejsca, w którym możesz określić niestandardowy separatorstring
(umieszczany między ciągami znaków do połączenia).Wypróbuj je na Go Playground .
2. Złożone ciągi (dokumenty)
Jeśli ciąg, który próbujesz utworzyć, jest bardziej złożony (np. Wieloliniowa wiadomość e-mail),
fmt.Sprintf()
staje się mniej czytelny i mniej wydajny (zwłaszcza jeśli musisz to zrobić wiele razy).W tym celu standardowa biblioteka udostępnia pakiety
text/template
ihtml/template
. Pakiety te implementują szablony oparte na danych do generowania tekstu wyjściowego.html/template
służy do generowania danych wyjściowych HTML zabezpieczonych przed wstrzyknięciem kodu. Zapewnia ten sam interfejs co pakiettext/template
i powinien być używany zamiasttext/template
zawsze, gdy wyjściem jest HTML.Używając
template
pakietów zasadniczo wymaga dostarczenia szablonu statycznego w postacistring
wartości (która może pochodzić z pliku, w którym to przypadku podajesz tylko nazwę pliku), która może zawierać tekst statyczny oraz działań, które są przetwarzane i wykonywane, gdy silnik przetwarza szablon i generuje dane wyjściowe.Możesz podać parametry, które są zawarte / podstawione w szablonie statycznym i które mogą kontrolować proces generowania danych wyjściowych. Typową formą takich parametrów są
struct
map
wartości i wartości, które mogą być zagnieżdżone.Przykład:
Załóżmy na przykład, że chcesz generować wiadomości e-mail wyglądające tak:
Aby wygenerować takie treści wiadomości e-mail, możesz użyć następującego szablonu statycznego:
I podaj dane do wykonania:
Zwykle dane wyjściowe szablonów są zapisywane do
io.Writer
, więc jeśli chcesz wynik jakostring
, utwórz i zapisz dobytes.Buffer
(który implementujeio.Writer
). Wykonanie szablonu i uzyskanie wyniku jakostring
:Spowoduje to oczekiwany wynik:
Wypróbuj na placu zabaw Go .
Należy również pamiętać, że od idź 1.10, nowsze, szybsze, bardziej wyspecjalizowane alternatywą jest dostępny na
bytes.Buffer
którym jest:strings.Builder
. Użycie jest bardzo podobne:Wypróbuj ten na Play Playground .
Uwaga: możesz również wyświetlić wynik wykonania szablonu, jeśli podasz
os.Stdout
jako cel (który również implementujeio.Writer
):Spowoduje to zapisanie wyniku bezpośrednio do
os.Stdout
. Wypróbuj to na placu zabaw Go .źródło
W twoim przypadku musisz użyć Sprintf () do formatu ciągu znaków.
func Sprintf(format string, a ...interface{}) string
Sprintf formatuje zgodnie ze specyfikatorem formatu i zwraca wynikowy ciąg.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
Twój wynik będzie:
źródło
Funkcja fmt.SprintF zwraca ciąg znaków i możesz sformatować ciąg w taki sam sposób, jak w przypadku fmt.PrintF
źródło
Możemy dostosować nowy typ ciągu za
define new Type
pomocąFormat
wsparcia.źródło