Golang сканирует одну и ту же строку несколько раз, используя bufio.Scanner - PullRequest
0 голосов
/ 07 декабря 2018

Я пишу код, который сканирует тестовый файл и заменяет текст чем-то другим.Хотел бы заменить один и тот же набор строк разными текстами, расположенными один под другим.Один из вариантов, который я нашел, - это использование функции tee в ioreader, но есть ли лучший способ добиться того же.

Например, я пытаюсь добиться замены подстроки methodtype в приведенном ниже фрагменте текста.с различными строками, такими как GET, POST и т. д. Чтобы получить вывод, как показано ниже:

ТЕКСТ:

router.Methods("methodtype").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse,
append(options, kitHttp.ServerBefore())...

ВЫХОД:

router.Methods("GET").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse,
append(options, kitHttp.ServerBefore())...


router.Methods("PUT").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse,
append(options, kitHttp.ServerBefore())...

router.Methods("POST").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse,
append(options, kitHttp.ServerBefore())...

1 Ответ

0 голосов
/ 07 декабря 2018

Чтобы заменить текст, вы можете использовать текст / шаблон вместо bufio:

Детская площадка: https://play.golang.org/p/7HYBqxtJ3KB

package main

import (
    "fmt"
    "text/template"
    "os"
)

type method struct {
    MethodType string
}

func main() {

    buf := `router.Methods("{{.MethodType}}").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse, append(options, kitHttp.ServerBefore())...
`

    tmpl, err := template.New("test").Parse(buf)
    if err != nil {
        panic(err)
    }

    methods := []string{"GET", "PUT", "POST"}

    for _, m := range methods {
        err = tmpl.Execute(os.Stdout, method{MethodType: m})
        if err != nil {
            fmt.Println(err.Error())
        }
    }

}

Вывод:

router.Methods("GET").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse, append(options, kitHttp.ServerBefore())...
router.Methods("PUT").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse, append(options, kitHttp.ServerBefore())...
router.Methods("POST").Path(templatepackagespec.MethodtypePath).Handler(kitHttp.NewServer(endpoints.FuncnameEndpoint
httptransport.EncodeResponse, append(options, kitHttp.ServerBefore())...
...