Стрингерная функция для вложенных структур - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть две структуры, одна внутри другой. Я хочу напечатать внутреннюю структуру с отступом к внешней. Например, предположим, что этот код:

package main

import "fmt"

type inner struct {
    c int
    d int
}

func (i inner) String() string {
    out := fmt.Sprintf("c = %d\n", i.c)
    out += fmt.Sprintf("d = %d", i.d)
    return out
}

type outer struct {
    a int
    i inner
}

func (o outer) String() string {
    out := fmt.Sprintf("a = %d\n", o.a)
    out += fmt.Sprintf("\t%v", o.i)
    return out
}

func main() {
    i := inner{c: 2, d: 3}
    o := outer{a: 1, i: i}

    fmt.Println(o)
}

Вывод этого кода:

a = 1
    c = 2
d = 3

Но я хочу:

a = 1
    c = 2
    d = 3

Я знаю одно возможное решение меняет каждую строку внутренней структуры, в строителе внешней структуры, чтобы начать с \t, но я хочу более чистое решение. Есть ли лучшее решение?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Вы можете использовать bufio.Scanner. bufio.NewScanner принимает io.Reader вместо string, но strings.NewReader может использоваться для его преобразования.

По сути, Scanner.Scan подготовит следующую строку, возвращая, если есть что потреблять (false означает, что произошла ошибка или мы уже все израсходовали). После этого вы используете Scanner.Text или Scanner.Bytes, чтобы получить подготовленную строку. В конце вы должны убедиться, что с Scanner.Err.

func indent(content string) (string, error) {
    out := ""
    scanner := bufio.NewScanner(strings.NewReader(content))
    for scanner.Scan() {
        out += fmt.Sprintf("\t%s\n", scanner.Text())
    }
    return out, scanner.Err()
}

не произошло никаких ошибок. Это должно поддерживать многоуровневое встраивание. Вы можете увидеть использование здесь .

0 голосов
/ 27 февраля 2020

Удалите \t из внешнего отпечатка

out += fmt.Sprintf("v", o.i)

И поместите его в свойства внутренней структуры

out := fmt.Sprintf("c = \t%d\n", i.c)
out += fmt.Sprintf("d = \t%d", i.d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...