Как написать промежуточное ПО для интерфейса с более чем одним методом? - PullRequest
0 голосов
/ 04 июля 2019

Я получил интерфейс с более чем одним методом. Интересно, как написать промежуточное программное обеспечение для него.

Я ищу в Google, но нашел все ответы для интерфейса только с одним методом. Я не нашел ничего для своей проблемы. И я пытаюсь написать демо, но это не работает.

package main

import (
    "fmt"
    "strconv"
)

type ti interface {
    Say(int) string
    Eat(string) int
}

type Middleware func(ti) ti

func GetMiddleWare(t ti) ti {
    var tm ti
    t.Say = func(i int) string {
        fmt.Println("arg is " + strconv.Itoa(i))
        var ret string
        defer func() {
            fmt.Println("ret is " + ret)
        }()
        ret = t.Say(i)
        return ret
    }
    t.Eat = func(s string) int {
        fmt.Println("arg is " + s)
        var ret int
        defer func() {
            fmt.Println("ret is " + strconv.Itoa(ret))
        }()
        ret = t.Eat(s)
        return ret
    }
    return tm
}

не работает

.\main.go:17:8: cannot assign to t.Say
.\main.go:26:8: cannot assign to t.Eat

Итак, как мне написать промежуточное программное обеспечение для интерфейса с более чем одним методом?

1 Ответ

0 голосов
/ 04 июля 2019

Определите тип, который переносит значение.Реализуйте методы интерфейса для этого типа.

// Middleware wraps the value t with logging.
type Middleware struct {
    t ti
}

func (m Middleware) Say(i int) string {
    fmt.Println("arg is " + strconv.Itoa(i))
    var ret string
    defer func() {
        fmt.Println("ret is " + ret)
    }()
    ret = m.t.Say(i)
    return ret
}

func (m Middleware) Eat(s string) int {
    fmt.Println("arg is " + s)
    var ret int
    defer func() {
        fmt.Println("ret is " + strconv.Itoa(ret))
    }()
    ret = m.t.Eat(s)
    return ret
}

func GetMiddleWare(t ti) ti {
    return Middleware{t}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...