go语言设计模式之interpreter
interpreter.go
package interpreter
import (
//"fmt"
"strconv"
"strings"
)
const (
SUM = "sum"
SUB = "sub"
MUL = "mul"
DIV = "div"
)
type polishNotationStack []int
func (p *polishNotationStack) Push(s int) {
*p = append(*p, s)
}
func (p *polishNotationStack) Pop() int {
length := len(*p)
if length > 0 {
temp := (*p)[length-1]
*p = (*p)[:length-1]
return temp
}
return 0
}
func Calculate(o string) (int, error) {
stack := polishNotationStack{}
operators := strings.Split(o, " ")
for _, operatorString := range operators {
if isOperator(operatorString) {
right := stack.Pop()
left := stack.Pop()
mathFunc := getOperationFunc(operatorString)
res := mathFunc(left, right)
stack.Push(res)
} else {
val, err := strconv.Atoi(operatorString)
if err != nil {
return 0, err
}
stack.Push(val)
}
}
return int(stack.Pop()), nil
}
func isOperator(o string) bool {
if o == SUM || o == SUB || o == MUL || o == DIV {
return true
}
return false
}
func getOperationFunc(o string) func(a, b int) int {
switch o {
case SUM:
return func(a, b int) int {
return a + b
}
case SUB:
return func(a, b int) int {
return a - b
}
case MUL:
return func(a, b int) int {
return a * b
}
case DIV:
return func(a, b int) int {
return a / b
}
}
return nil
}
interpreter_test.go
package interpreter
import (
"testing"
)
func TestCalculate(t *testing.T) {
tempOperation := "3 4 sum 2 sub"
res, err := Calculate(tempOperation)
if err != nil {
t.Error(err)
}
if res != 5 {
t.Errorf("Expected result not found: %d != %d\n", 5, res)
}
tempOperation = "5 3 sub 8 mul 4 sum 5 div"
res, err = Calculate(tempOperation)
if err != nil {
t.Error(err)
}
if res != 4 {
t.Errorf("Expected result not found: %d != %d\n", 4, res)
}
}

go语言设计模式之interpreter的更多相关文章
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- [设计模式]解释器(Interpreter)之大胆向MM示爱吧
为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “我刚写了个小程序,需要你来参与下.”我把MM叫到我的电脑旁,“来把下面这条命令打进去,这是个练习打(Pian)符(ni)号(de)的 ...
- 面向对象设计模式之Interpreter解释器模式(行为型)
动机:在软件构建过程中 ,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化.在这种情况下,将特定领域的问题表达为某种语法规则的句子,然后构建一个 ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- 设计模式之Interpreter(解释器)(转)
Interpreter定义: 定义语言的文法 ,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造 ...
- Go语言设计模式实践:迭代器(Iterator)
关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...
- Go语言设计模式实践:组合(Composite)
关于本系列 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代 ...
- Go语言设计模式汇总
目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...
- C语言设计模式
一 .C语言和设计模式(继承.封装.多态) C++有三个最重要的特点,即继承.封装.多态.我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...
随机推荐
- CentOS7环境下安装docker
操作系统 : CentOS7.5.1804_x64 docker版本: docker-ce-18.06.3 准备环境 1.如之前安装过移除老旧版本 yum remove docker docker-c ...
- Pull Request 工作流——更高效的管理代码
目录 Pull Request 工作流--更高效的管理代码 1.问题 2.解决方案 3.Git分支流管理代码具体实施 3.1本地分支操作管理 3.1.1查看分支 3.1.2创建分支 3.1.3切换分支 ...
- axios解决跨域问题(vue-cli3.0)
一.什么是跨域 1.跨域 指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 2.同源策略 是指协议,域名,端口都要相同,其中有一个不同都 ...
- Linux常用命令及详细说明 — 结合工作(侧重性能监控,包括CPU、内存、IO、网络、磁盘等)
(一)Linux监控的几个常用命令(对于服务器后端程序猿很重要,必须掌握): 命令 功能 命令 功能 iostat 统计CPU及网络.设备和分区IO的数据 vmstat 展示给定时间服务器的状态值(包 ...
- pip命令详解
使用详解 1.pip安装软件 # pip install SomePackage 2.pip查看已安装的软件 # pip show --files SomePackage 3.pip检查哪些软件需要更 ...
- 什么是面向对象编程(OOP)?
Java 程序员第一个要了解的基础概念就是:什么是面向对象编程(OOP)? 玩过 DOTA2 (一款推塔杀人的游戏)吗?里面有个齐天大圣的角色,欧洲战队玩的很溜,国内战队却不怎么会玩,自家人不会玩自家 ...
- .net core 日常学习第一篇
使用vs 2015 update3 版本,安装sdk:https://dotnet.microsoft.com/download 可以运行 .net core 1.x版 或者使用vs 2017及以上 ...
- python的pip工具在windows和ubuntu中遇到的问题
pip问题 windows 描述:pip错误-failed to create process/fatal error in launcher 原因:电脑同时装了python2和python3,并且都 ...
- C#中 EF 性能优化
https://www.cnblogs.com/chenwolong/p/7531955.html EF使用AsNoTracking(),无跟踪查询技术(查询出来的数据不可以修改,如果你做了修改,你会 ...
- Bootstrap基本CSS样式
一.简介.使用 1.简介 Bootstrap 来源于 Twitter,是一款基于 Html.Css.JavaScript 的前端UI框架.可以方便.快速的开发web界面. 教程:https://www ...