甲字符串處理,以降低,添加前綴/後綴,base64等,將是最好的例子國際海事組織。
這是你問的例子:
package main
import (
"fmt"
"strings"
)
const (
prefix = "PREFIX"
suffix = "SUFFIX"
)
type Decorated=string
func addConstPrefix(s string) string {
return prefix + s
}
func addConstSuffix(s string) string {
return s + suffix
}
type Decorator=func(string) string
func Decorate(c Decorated, ds ...Decorator) Decorated {
decorated := c
for _, decorator := range ds {
decorated = decorator(decorated)
}
return decorated
}
func main() {
var toLower Decorator = strings.ToLower
var toUpper Decorator = strings.ToUpper
var dec3 Decorator = addConstPrefix
var dec4 Decorator = addConstSuffix
input := "Let's decorate me!"
inputUppercase := Decorate(input, []Decorator{toUpper}...)
fmt.Println(inputUppercase)
allDecorators := []Decorator{toUpper, toLower, dec3, dec4}
output := Decorate(input, allDecorators...)
fmt.Println(output)
}
注意,爲了簡單起見,使用Golang的類型別名,這是在圍棋1.9推出。這些都是我們所使用的兩個別名:
type Decorated=string
type Decorator=func(string)string
,這樣以後可應用於您的Decorate()
功能。然後,我們只是創造一些裝飾相匹配,我們定義的類型簽名這(功能):
var toLower Decorator = strings.ToLower
var toUpper Decorator = strings.ToUpper
var dec3 Decorator = addConstPrefix
var dec4 Decorator = addConstSuffix
,並將其應用:
allDecorators := []Decorator{toUpper, toLower, dec3, dec4}
output := Decorate(input, allDecorators...)
編輯:
一個參數化裝飾會簡單地說就是返回另一個功能的功能,例如:
func addPrefix(prefix string) func(string) string {
return func(s string) string {
return prefix + s
}
}
它可以然後以下列方式施加:
input2 := "Let's decorate me!"
prefixed := Decorate(input2, []Decorator{addPrefix("Well, ")}...)
這正是Go中的Decorator函數模式,我一直在尋找非常感謝! – xpt
如果我理解正確,按照定義的'AppendDecorator',只能用作第一個操作追加? – RayfenWindspear
https://play.golang.org/p/rrBnAJOIc2不,AppendDecorator與其他的有所不同,因爲你需要調用它來返回實際的裝飾器,而不是使用你想要的函數調用它裝飾。基本上它只是爲你傳遞給AppendDecorator的字符串創建一個閉包,並返回一個新的裝飾器,然後訪問該字符串... – mkopriva