ChainOfResponsibility.go
패키지 ChainOfResponsibility 수입 ( "FMT" "IO" "문자열" ) {ChainLogger 인터페이스를 입력 다음 (문자열) } {FirstLogger 구조체를 입력 NextChain ChainLogger } 다음 FUNC (문자열들) (* FirstLogger F) { fmt.Printf ( "첫 번째 로거 %의 \ n", S) f.NextChain 경우! = 전무 { f.NextChain.Next (들) } } {SecondLogger 구조체를 입력 NextChain ChainLogger } FUNC (SE * SecondLogger) 다음에 (S 문자열) { 경우 strings.Contains (strings.ToLower (들), "안녕하세요") { fmt.Printf ( "제 로거 %의 \ n", S) se.NextChain 경우! = 전무 { se.NextChain.Next (들) } 반환 } fmt.Printf ( "제 로깅 정삭 \ n \ n") } {WriterLogger 구조체를 입력 NextChain ChainLogger 작가 io.Writer } 다음 FUNC (문자열들) (* WriterLogger w) { w.Writer 경우! = 전무 { w.Writer.Write ([] 바이트 ( "WriterLogger"+ S)) } w.NextChain 경우! = 전무 { w.NextChain.Next (들) } }
ChainOfResponsibility_test.go
패키지 ChainOfResponsibility 수입 ( "FMT" "문자열" "테스트" ) {myTestWriter 구조체를 입력 receivedMessage * 문자열 } FUNC (m * myTestWriter) 쓰기 (p [] 바이트) (INT 에러) { 경우 m.receivedMessage == 전무 { m.receivedMessage = 새 (문자열) } tempMessage = fmt.Sprintf ( "% P % S"m.receivedMessage, P) m.receivedMessage = tempMessage 창 LEN (p), 전무 } FUNC (m * myTestWriter) 다음에 (S 문자열) { m.Write ([] 바이트 (들)) } FUNC TestCreateDefaultChain (t * testing.T) { myWriter = myTestWriter {} writerLogger = WriterLogger {작가 : & myWriter} 초 = {SecondLogger NextChain & writerLogger} 체인 = {FirstLogger NextChain & 초} t.Run는 (+ "를 3 로거, 그 중 2가 세운 두 번째 경우에만, 콘솔에 기록" "세상 '안녕하세요', 일부 변수의 경우 두 번째 FOUND '안녕하세요'에 세 번째 쓰기", FUNC (t * testing.T) { chain.Next ( "메시지 휴식 체인 \ n 그") myWriter.receivedMessage 경우! = 전무 { t.Error ( "마지막 링크는 모든 메시지를받지해야한다") } chain.Next ( "안녕하세요 \ n") * myWriter.receivedMessage == ""만약 || ! strings.Contains (* myWriter.receivedMessage, "안녕하세요") { t.Fatal ( "마지막 링크는 예상 메시지를 수신하지 않았다") } }) }