Skip to content

Commit f3ec201

Browse files
author
xiachongshang
committed
第一版
1 parent 02245cb commit f3ec201

File tree

8 files changed

+620
-42
lines changed

8 files changed

+620
-42
lines changed

CompEvent.go

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package comp
2+
3+
//计算用的参数
4+
type CompEvent struct {
5+
//对象
6+
ObjList []Iobject
7+
//变量
8+
Param []int64
9+
}
10+
11+
//获取变量值;
12+
//使用a,b,c,d,e,f,g来定义变量,所以a对应的就是数组索引0,依次类推
13+
func (et *CompEvent) GetVal(cn *CompNode) (result int64) {
14+
if cn.Var == "" {
15+
return cn.Val
16+
} else {
17+
i := int(cn.Var[0] - Coust_a) //拿到变量索引
18+
if len(et.Param) > i {
19+
result = et.Param[i]
20+
}
21+
}
22+
return
23+
}
24+
25+
//获取对象的属性值
26+
func (et *CompEvent) GetObjAttr(cn *CompNode) (result int64) {
27+
for i := range et.ObjList {
28+
if et.ObjList[i].GetObjName() == cn.Obj {
29+
return et.ObjList[i].GetAttr(cn.Var)
30+
}
31+
}
32+
return 0
33+
}

CompNode.go

+27-42
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package comp
22

33
import (
44
"fmt"
5+
"strings"
56
)
67

78
var (
@@ -18,6 +19,7 @@ func init() {
1819
FuncLi = make(map[string]CompMark)
1920
}
2021

22+
//注册函数
2123
func RegisterComp(name string, f CompMark) {
2224
FuncLi[name] = f
2325
}
@@ -34,82 +36,60 @@ func NewCompNode(exp string) *CompNode {
3436
return result
3537
}
3638

37-
type CompMark func(node *CompNode, arr []int64) int64
39+
type CompMark func(node *CompNode, et *CompEvent) int64
3840

3941
//计算对象
4042
type CompNode struct {
41-
Var string //值
43+
Obj string //对象
44+
Var string //属性(变量)
4245
Val int64 //值数据
4346
Num1 *CompNode //数据1
4447
Mark string //运算符号
4548
Num2 *CompNode //数据2
4649
}
4750

48-
//循环计算
49-
func (cn *CompNode) CompVal(param []int64) int64 {
50-
51-
if cn.Mark != "" {
52-
return cn.markComp(param)
53-
} else {
54-
return cn.getVal(param)
55-
}
56-
// } else if cn.Mark == "+" || cn.Mark == "-" || cn.Mark == "*" || cn.Mark == "/" {
57-
// return "(" + cn.Num1.String() + " " + cn.Mark + " " + cn.Num2.String() + ")"
58-
// } else {
59-
// return cn.Mark + "(" + cn.Num1.String() + "," + cn.Num2.String() + ")"
60-
// }
61-
}
62-
6351
func (cn *CompNode) String() string {
64-
if cn.Var != "" {
65-
return cn.Var
66-
} else if cn.Mark == "+" || cn.Mark == "-" || cn.Mark == "*" || cn.Mark == "/" || cn.Mark == "%" {
52+
if cn.Mark == "+" || cn.Mark == "-" || cn.Mark == "*" || cn.Mark == "/" || cn.Mark == "%" {
6753
return "(" + cn.Num1.String() + " " + cn.Mark + " " + cn.Num2.String() + ")"
54+
} else if cn.Mark == "." {
55+
return cn.Obj + "." + cn.Var
6856
} else if cn.Mark != "" {
6957
return cn.Mark + "(" + cn.Num1.String() + "," + cn.Num2.String() + ")"
58+
} else if cn.Var != "" {
59+
return cn.Var
7060
} else {
7161
return fmt.Sprint(cn.Val)
7262
}
7363
}
7464

75-
func (cn *CompNode) markComp(arr []int64) (result int64) {
65+
//循环计算
66+
func (cn *CompNode) CompVal(et *CompEvent) (result int64) {
7667
switch cn.Mark {
68+
case "":
69+
result = et.GetVal(cn)
70+
case ".":
71+
result = et.GetObjAttr(cn)
7772
case "+":
78-
result = cn.Num1.CompVal(arr) + cn.Num2.CompVal(arr)
73+
result = cn.Num1.CompVal(et) + cn.Num2.CompVal(et)
7974
case "-":
80-
result = cn.Num1.CompVal(arr) - cn.Num2.CompVal(arr)
75+
result = cn.Num1.CompVal(et) - cn.Num2.CompVal(et)
8176
case "*":
82-
result = cn.Num1.CompVal(arr) * cn.Num2.CompVal(arr)
77+
result = cn.Num1.CompVal(et) * cn.Num2.CompVal(et)
8378
case "/":
84-
result = cn.Num1.CompVal(arr) / cn.Num2.CompVal(arr)
79+
result = cn.Num1.CompVal(et) / cn.Num2.CompVal(et)
8580
case "%":
86-
result = cn.Num1.CompVal(arr) % cn.Num2.CompVal(arr)
81+
result = cn.Num1.CompVal(et) % cn.Num2.CompVal(et)
8782
default:
8883
if f, ok := FuncLi[cn.Mark]; ok {
8984
//找到函数
90-
result = f(cn, arr)
85+
result = f(cn, et)
9186
} else {
9287
fmt.Println(" CompNode Error. Not exist Func ", cn.Mark, ". on CompNode:", cn)
9388
}
9489
}
9590
return
9691
}
9792

98-
//拿到值
99-
func (cn *CompNode) getVal(arr []int64) (result int64) {
100-
//使用a,b,c,d,e,f,g来定义变量,所以a对应的就是数组索引0,依次类推
101-
if cn.Var != "" {
102-
//是变量
103-
i := int(cn.Var[0] - Coust_a) //拿到变量索引
104-
if len(arr) > i {
105-
result = arr[i]
106-
}
107-
} else {
108-
result = cn.Val
109-
}
110-
return
111-
}
112-
11393
//运算数据
11494
func compStringToArray(exp string) (result []string) {
11595
arr := []rune(exp)
@@ -152,6 +132,11 @@ func newComp(v string) *CompNode {
152132
result := new(CompNode)
153133
if t, ok := NewString(v).ToInt64(); ok == nil {
154134
result.Val = t
135+
} else if index := strings.IndexRune(v, '.'); index >= 0 {
136+
//对象的属性变量
137+
result.Obj = v[:index]
138+
result.Var = v[index+1:]
139+
result.Mark = "."
155140
} else {
156141
result.Var = v
157142
}

Iobject.go

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package comp
2+
3+
//对象实现接口
4+
type Iobject interface {
5+
//获取自己的名字
6+
GetObjName() string
7+
//获取属性
8+
GetAttr(attrname string) int64
9+
}
10+
11+
type IAttr interface {
12+
//获取属性
13+
GetAttr(attrname string) int64
14+
}
15+
16+
func NewObjectAttr(name string, obj IAttr) Iobject {
17+
result := new(ObjectAttr)
18+
result.name = name
19+
result.IAttr = obj
20+
return result
21+
}
22+
23+
type ObjectAttr struct {
24+
name string
25+
IAttr
26+
}
27+
28+
//获取自己的名字
29+
func (obj *ObjectAttr) GetObjName() string {
30+
return obj.name
31+
}

StringBuilder.go

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package comp
2+
3+
import (
4+
"bytes"
5+
)
6+
7+
/*
8+
StringBuilder struct.
9+
Usage:
10+
builder := NewStringBuilder()
11+
builder.Append("a").Append("b").Append("c")
12+
s := builder.String()
13+
println(s)
14+
print:
15+
abc
16+
啊啊啊
17+
*/
18+
19+
// StringBuilder
20+
type StringBuilder struct {
21+
buffer bytes.Buffer
22+
}
23+
24+
//NewStringBuilderCap 带容器长度的创建
25+
func NewStringBuilderCap(capnum int) *StringBuilder {
26+
builder := StringBuilder{
27+
buffer: *bytes.NewBuffer(make([]byte, 0, capnum)),
28+
}
29+
return &builder
30+
}
31+
32+
func NewStringBuilder() *StringBuilder {
33+
var builder StringBuilder
34+
return &builder
35+
}
36+
37+
func NewStringBuilderString(str *String) *StringBuilder {
38+
var builder StringBuilder
39+
builder.buffer.WriteString(str.ToString())
40+
return &builder
41+
}
42+
43+
func (builder *StringBuilder) Appendln(s string) *StringBuilder {
44+
builder.buffer.WriteString(s + "\n")
45+
return builder
46+
}
47+
48+
func (builder *StringBuilder) Append(s string) *StringBuilder {
49+
builder.buffer.WriteString(s)
50+
return builder
51+
}
52+
53+
func (builder *StringBuilder) AppendRune(s rune) *StringBuilder {
54+
builder.buffer.WriteRune(s)
55+
return builder
56+
}
57+
58+
func (builder *StringBuilder) AppendStrings(ss ...string) *StringBuilder {
59+
for i := range ss {
60+
builder.buffer.WriteString(ss[i])
61+
}
62+
return builder
63+
}
64+
65+
func (builder *StringBuilder) AppendInt(i int) *StringBuilder {
66+
builder.buffer.WriteString(NewStringInt(i).ToString())
67+
return builder
68+
}
69+
70+
func (builder *StringBuilder) AppendInt64(i int64) *StringBuilder {
71+
builder.buffer.WriteString(NewStringInt64(i).ToString())
72+
return builder
73+
}
74+
75+
func (builder *StringBuilder) AppendFloat64(f float64) *StringBuilder {
76+
builder.buffer.WriteString(NewStringFloat64(f).ToString())
77+
return builder
78+
}
79+
80+
func (builder *StringBuilder) Replace(old, new string) *StringBuilder {
81+
str := NewString(builder.ToString()).Replace(old, new)
82+
builder.Clear()
83+
builder.buffer.WriteString(str.ToString())
84+
return builder
85+
}
86+
87+
func (builder *StringBuilder) RemoveLast() *StringBuilder {
88+
str1 := NewString(builder.ToString())
89+
builder.Clear()
90+
str2 := str1.Substring(0, str1.Len()-1)
91+
builder.buffer.WriteString(str2.ToString())
92+
return builder
93+
}
94+
95+
func (builder *StringBuilder) Clear() *StringBuilder {
96+
builder.buffer.Reset()
97+
return builder
98+
}
99+
100+
func (builder *StringBuilder) ToString() string {
101+
return builder.buffer.String()
102+
}
103+
104+
//IsEmpty 是否为空字符串
105+
func (builder *StringBuilder) IsEmpty() bool {
106+
return builder.buffer.Len() == 0
107+
}

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
module github.com/buguang01/comp
22

33
go 1.17
4+
5+
require github.com/buguang01/util v1.1.14 // indirect

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github.com/buguang01/util v1.1.14 h1:7Cg1gNXvLTUlw9pO6thdk7C+nCe2dsHmOnjY3LqkVTs=
2+
github.com/buguang01/util v1.1.14/go.mod h1:B+DxHXSPTtnB8d14pksEsAGB/R5VM4QrVmr7ok5RisA=

0 commit comments

Comments
 (0)