diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a40cefe7466b9e20b352701ef7893a4eca7d83c0..e80a18f5fe76a2ee7ef5b62270ebd787332f9945 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -19,11 +19,26 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -33,6 +48,7 @@
@@ -58,74 +74,85 @@
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
-
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
+
+
+
+
-
-
-
-
@@ -157,7 +184,17 @@
-
+
+
+
+
+
+
+
+
+
+
+
1638720681912
@@ -194,7 +231,49 @@
1638894518419
-
+
+ 1639325723378
+
+
+
+ 1639325723379
+
+
+ 1639325745611
+
+
+
+ 1639325745611
+
+
+ 1639325758148
+
+
+
+ 1639325758148
+
+
+ 1639325805904
+
+
+
+ 1639325805904
+
+
+ 1639412304915
+
+
+
+ 1639412304915
+
+
+ 1639412316956
+
+
+
+ 1639412316956
+
+
@@ -216,7 +295,10 @@
-
+
+
+
+
true
@@ -236,30 +318,42 @@
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
-
+
+
diff --git a/arrays.go b/arrays/arrays.go
similarity index 100%
rename from arrays.go
rename to arrays/arrays.go
diff --git a/basic.go b/basic/basic.go
similarity index 50%
rename from basic.go
rename to basic/basic.go
index 920a7c1704e4fd3b8ce6622d317b73c28e724fdf..b3aedec6dd2730c200a0946ede484c74fb85f52e 100644
--- a/basic.go
+++ b/basic/basic.go
@@ -7,94 +7,97 @@ import (
)
/*此处不能使用 := 来定义变量
- go 语言都中包内变量,go 没有全局变量
- 函数包变量可以不使用,
+go 语言都中包内变量,go 没有全局变量
+函数包变量可以不使用,
*/
-var xx =3
-var ss =100
+var xx = 3
+var ss = 100
+
/*统一定义变量*/
-var(
- x1=23
- x2=true
- x3=323.23
+var (
+ x1 = 23
+ x2 = true
+ x3 = 323.23
)
-func variableZeroValue() {
+func variableZeroValue() {
/*函数内部变量必须被使用*/
var a int
var s string
fmt.Printf("%d %q\n", a, s)
}
-func variableInitialValue() {
- var a ,b int = 3,4
+func variableInitialValue() {
+ var a, b int = 3, 4
var s string = "abc"
- fmt.Println(a,b, s)
+ fmt.Println(a, b, s)
}
-
-func variableTypeDeduction() {
- var x ,b ,c,e,f = 3.23,4,"abdad",true, 4.54
- fmt.Println(x,b,f+1, c,e)
+func variableTypeDeduction() {
+ var x, b, c, e, f = 3.23, 4, "abdad", true, 4.54
+ fmt.Println(x, b, f+1, c, e)
}
-func variableShorter() {
- /*
+func variableShorter() {
+ /*
不使用 var
第一次定义变量可以使用:=,但是只能在函数内部使用,外部不能使用
- */
- x ,b ,c,e,f := 3.23,4,"abdad",true, 4.54
- fmt.Println(x,b,f+1, c,e)
+ */
+ x, b, c, e, f := 3.23, 4, "abdad", true, 4.54
+ fmt.Println(x, b, f+1, c, e)
}
-func euler() {
- c:=3 +4i
+func euler() {
+ c := 3 + 4i
fmt.Println(cmplx.Abs(c))
}
+
/*强制转换*/
-func triangle() {
- a ,b :=3,5
+func triangle() {
+ a, b := 3, 5
var c int
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}
+
/*常量*/
-func consts() {
+func consts() {
/*const filename="abc.txt"
const a, b = 3, 4 */
/* 集中写常量*/
- const(
- filename ="abc.txt"
- a, b = 3, 4
+ const (
+ filename = "abc.txt"
+ a, b = 3, 4
)
var c int
c = int(math.Sqrt(a*a + b*b))
- fmt.Println(filename,c )
+ fmt.Println(filename, c)
}
+
/*枚举*/
-func enums() {
+func enums() {
/*常量定义必须给赋值*/
- const(
- cpp=iota // 自动填充递长
+ const (
+ cpp = iota // 自动填充递长
java
python
golang
javasscipt
- _ // 下划线跳过自动填充值
+ _ // 下划线跳过自动填充值
php
)
- const x int =0
- fmt.Println(x, cpp,python,golang,javasscipt,java,php)
+ const x int = 0
+ fmt.Println(x, cpp, python, golang, javasscipt, java, php)
/*设置自增表达式*/
- const(
- b = 1 <<(10*iota)
+ const (
+ b = 1 << (10 * iota)
kb
mb
gb
tb
pb
)
- fmt.Println(b,kb,mb,gb,tb,pb)
+ fmt.Println(b, kb, mb, gb, tb, pb)
}
func main() {
@@ -102,7 +105,7 @@ func main() {
variableInitialValue()
variableTypeDeduction()
variableShorter()
- fmt.Println(x1,x2,x3)
+ fmt.Println(x1, x2, x3)
euler()
triangle()
consts()
diff --git a/branch.go b/branch.go
deleted file mode 100644
index 2a169c966db6b7d6e648ab2a04b514b2d1053c27..0000000000000000000000000000000000000000
--- a/branch.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package main
-
-import (
- "fmt"
- "io/ioutil"
-)
-
-func ifcondition() {
- const filename = "test.txt"
- // ReadFile reads the file named by filename and returns the contents.
- // A successful call returns err == nil, not err == EOF. Because ReadFile
- // reads the whole file, it does not treat an EOF from Read as an error
- // to be reported.
- contents ,err := ioutil.ReadFile(filename)
- // if不需要 括号
- if err != nil{
- fmt.Println(err)
- }else{
- fmt.Printf("%s\n" ,contents)
- }
-
- // 简单写法
- if content ,err := ioutil.ReadFile(filename); err != nil{
- fmt.Println(err)
- } else{
- fmt.Printf("%s\n" ,content)
- }
- //fmt.Printf("%s\n" ,content) 此处不能再访问 content ,生命周期在if中,外部不能访问
-}
-
-func grade(score int ) string {
- g:= ""
- // switch 后面可以跟 选择参数,也可以不跟参数
- switch {
- case score < 0 || score >100:
- // panic 报错并中断程序执行,
- panic(fmt.Sprintf( "Wront score: %d",score))
- case score < 60 :
- g = "不及格"
- case score < 80:
- g = "一般"
- case score < 90:
- g = "良好"
- case score <= 100:
- g = "优秀"
- }
- return g
-}
-
-
-func main() {
- ifcondition()
- fmt.Println(
- grade(33),
- grade(67),
- grade(98),
- grade(81),
- grade(100),
- )
-
-}
diff --git a/branch/branch.go b/branch/branch.go
new file mode 100644
index 0000000000000000000000000000000000000000..a19e256f79b240e82ab69ac6b7e78f2abdf23260
--- /dev/null
+++ b/branch/branch.go
@@ -0,0 +1,60 @@
+package main
+
+import (
+ "fmt"
+ "io/ioutil"
+)
+
+func ifcondition() {
+ const filename = "test.txt"
+ // ReadFile reads the file named by filename and returns the contents.
+ // A successful call returns err == nil, not err == EOF. Because ReadFile
+ // reads the whole file, it does not treat an EOF from Read as an error
+ // to be reported.
+ contents, err := ioutil.ReadFile(filename)
+ // if不需要 括号
+ if err != nil {
+ fmt.Println(err)
+ } else {
+ fmt.Printf("%s\n", contents)
+ }
+
+ // 简单写法
+ if content, err := ioutil.ReadFile(filename); err != nil {
+ fmt.Println(err)
+ } else {
+ fmt.Printf("%s\n", content)
+ }
+ //fmt.Printf("%s\n" ,content) 此处不能再访问 content ,生命周期在if中,外部不能访问
+}
+
+func grade(score int) string {
+ g := ""
+ // switch 后面可以跟 选择参数,也可以不跟参数
+ switch {
+ case score < 0 || score > 100:
+ // panic 报错并中断程序执行,
+ panic(fmt.Sprintf("Wront score: %d", score))
+ case score < 60:
+ g = "不及格"
+ case score < 80:
+ g = "一般"
+ case score < 90:
+ g = "良好"
+ case score <= 100:
+ g = "优秀"
+ }
+ return g
+}
+
+func main() {
+ ifcondition()
+ fmt.Println(
+ grade(33),
+ grade(67),
+ grade(98),
+ grade(81),
+ grade(100),
+ )
+
+}
diff --git a/func.go b/func/func.go
similarity index 100%
rename from func.go
rename to func/func.go
diff --git a/helloworld.go b/helloworld/helloworld.go
similarity index 100%
rename from helloworld.go
rename to helloworld/helloworld.go
diff --git a/nonrepeating.go b/nonrepeating/nonrepeating.go
similarity index 100%
rename from nonrepeating.go
rename to nonrepeating/nonrepeating.go
diff --git a/queue/entry/main.go b/queue/entry/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..143edbe4d7896d6a597dd7739f904741f2374fd9
--- /dev/null
+++ b/queue/entry/main.go
@@ -0,0 +1,20 @@
+package main
+
+import (
+ "fmt"
+ "learngo/queue"
+)
+
+func main() {
+
+ q := queue.Queue{1}
+ q.Push(2)
+ q.Push(3)
+ //q.Push(4)
+
+ fmt.Println(q.Pop())
+ fmt.Println(q.Pop())
+ fmt.Println(q.IsEmpty())
+ fmt.Println(q.Pop())
+ fmt.Println(q.IsEmpty())
+}
diff --git a/queue/queue.go b/queue/queue.go
new file mode 100644
index 0000000000000000000000000000000000000000..03f121972d799261e2f76c1d79a92e50b9c4a20e
--- /dev/null
+++ b/queue/queue.go
@@ -0,0 +1,16 @@
+package queue
+
+// 定义别名
+type Queue []interface{}
+
+func (q *Queue) Push(v interface{}) {
+ *q = append(*q, v)
+}
+func (q *Queue) Pop() interface{} {
+ head := (*q)[0]
+ *q = (*q)[1:]
+ return head
+}
+func (q *Queue) IsEmpty() bool {
+ return len(*q) == 0
+}
diff --git a/readerWriter/main.go b/readerWriter/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..d3dc3908ef450f49e3622a478d5c803cdd3e8c90
--- /dev/null
+++ b/readerWriter/main.go
@@ -0,0 +1,42 @@
+package main
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+)
+
+func printFile(filename string) {
+
+ file, err := os.Open(filename)
+ if err != nil {
+ panic(err)
+ }
+ scanner := bufio.NewScanner(file)
+
+ for scanner.Scan() {
+ fmt.Println(scanner.Text())
+ }
+ printFileContests(file)
+}
+func printFileContests(reader io.Reader) {
+ scanner := bufio.NewScanner(reader)
+ for scanner.Scan() {
+ fmt.Println(scanner.Text())
+ }
+}
+
+func main() {
+
+ printFile("test.txt")
+ var str string = "dafwef"
+ s := `test.txt
+ sdfasdf
+wefwef wefwef"wefwefwfe"
+ `
+ printFileContests(strings.NewReader(s))
+ printFileContests(bytes.NewBufferString(str))
+}
diff --git a/retriever/main.go b/retriever/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..bb9adb90c37b3c384ab2ece9d5b53777021a0e74
--- /dev/null
+++ b/retriever/main.go
@@ -0,0 +1,85 @@
+package main
+
+import (
+ "fmt"
+ "learngo/retriever/mock"
+ "learngo/retriever/real"
+ "time"
+)
+
+type Retriever interface {
+ Get(url string) string
+}
+
+type Poster interface {
+ Post(url string, form map[string]string) string
+}
+
+const url = "http://www.baidu.com"
+
+func download(r Retriever) string {
+ return r.Get(url)
+}
+
+func post(poster Poster) {
+ poster.Post(url, map[string]string{
+ "name": "ccmouse",
+ "course": "golang",
+ })
+}
+
+type RetrieverPoster interface {
+ Retriever
+ Poster
+}
+
+func session(s RetrieverPoster) string {
+ s.Post(url, map[string]string{
+ "contents": " 修改后的数据",
+ })
+
+ return "OK"
+ //return s.Get(url)
+}
+
+func main() {
+ var r Retriever
+ r = mock.Retriever{"this is my test interface"}
+ // 查询接口类型
+ fmt.Printf("%T %v", r, r)
+ inspect(r)
+ //fmt.Println(download(r))
+ r = &real.Retriever{
+ UserAgent: "Mozilla/5.0",
+ TimeOut: time.Minute,
+ }
+ inspect(r)
+ //fmt.Printf("%T %v" ,r,r )
+ //fmt.Println(download(r))
+
+ // type assertion 断言
+ if retriever, ok := r.(mock.Retriever); ok {
+ fmt.Println(retriever.Contents)
+ } else {
+ fmt.Println(" not a mock Retriever")
+ }
+
+ fmt.Println(" =================")
+ retriever := mock.Retriever{"this is default value"}
+ fmt.Println(session(retriever))
+ fmt.Println(" ============= post ====")
+ realretriever := &real.Retriever{UserAgent: "this is default Value"}
+ fmt.Println(session(realretriever))
+ fmt.Println(realretriever.UserAgent)
+
+}
+
+func inspect(r Retriever) {
+ fmt.Printf("%T %v", r, r)
+ switch v := r.(type) {
+ case mock.Retriever:
+ fmt.Println("Contents:", v.Contents)
+ case *real.Retriever:
+ fmt.Println("UserAgent:", v.UserAgent)
+ }
+}
diff --git a/retriever/mock/mockretriever.go b/retriever/mock/mockretriever.go
new file mode 100644
index 0000000000000000000000000000000000000000..d6d276e2d3b0ccf3cccd8e146acf9e02324db919
--- /dev/null
+++ b/retriever/mock/mockretriever.go
@@ -0,0 +1,14 @@
+package mock
+
+type Retriever struct {
+ Contents string
+}
+
+func (r Retriever) Post(url string, form map[string]string) string {
+ r.Contents = form["contents"]
+ return "ok"
+}
+
+func (r Retriever) Get(url string) string {
+ return r.Contents
+}
diff --git a/retriever/real/realretriever.go b/retriever/real/realretriever.go
new file mode 100644
index 0000000000000000000000000000000000000000..c5f5204e0535a22ba05c390e63a0594f7a420ec1
--- /dev/null
+++ b/retriever/real/realretriever.go
@@ -0,0 +1,39 @@
+package real
+
+import (
+ "fmt"
+ "net/http"
+ "net/http/httputil"
+ "time"
+)
+
+type Retriever struct {
+ UserAgent string
+ TimeOut time.Duration
+}
+
+func (r *Retriever) String() string {
+ return fmt.Sprintf(
+ "contents=%s", r.UserAgent,
+ )
+}
+
+func (r *Retriever) Post(url string, form map[string]string) string {
+ r.UserAgent = form["contents"]
+ return "ok"
+}
+
+func (r *Retriever) Get(url string) string {
+
+ resp, err := http.Get(url)
+ if err != nil {
+ panic(err)
+ }
+
+ result, err := httputil.DumpResponse(resp, true)
+ resp.Body.Close()
+ if err != nil {
+ panic(err)
+ }
+ return string(result)
+}
diff --git a/sliceops.go b/sliceops/sliceops.go
similarity index 100%
rename from sliceops.go
rename to sliceops/sliceops.go
diff --git a/slices.go b/slices/slices.go
similarity index 100%
rename from slices.go
rename to slices/slices.go
diff --git a/strings.go b/string/strings.go
similarity index 100%
rename from strings.go
rename to string/strings.go
diff --git a/test.txt b/test.txt
index 4cd109e442521cddbe7248d3bc10f10d35961696..2a43ba4e7ca14bb25927ec39685bf2b4473333fd 100644
--- a/test.txt
+++ b/test.txt
@@ -2,5 +2,5 @@
hello world
aaa
234234
-
+4567890
234234234
\ No newline at end of file
diff --git a/tree/MenuNode.go b/tree/MenuNode.go
index cbc484a346014993862207a8dc6cd25215428fc9..0518b7623fbae784da001890fc2ad4ba4da26e25 100644
--- a/tree/MenuNode.go
+++ b/tree/MenuNode.go
@@ -25,3 +25,8 @@ func (node *TreeMenuNode) SetName(name string) {
}
node.Name = name
}
+
+// 工厂函数定义
+func CraeteTreeMenuNode(name string) *TreeMenuNode {
+ return &TreeMenuNode{Name: name}
+}
diff --git a/tree/entry/entry.go b/tree/entry/entry.go
index 7172a4762cbb98e255a847022b5d3e67c61bb2ae..46fb54064348efe686c17f696c2868f57f3f93a9 100644
--- a/tree/entry/entry.go
+++ b/tree/entry/entry.go
@@ -5,6 +5,25 @@ import (
"learngo/tree"
)
+/*
+包扩展
+1、定义别名
+2、使用组合
+*/
+// 组合 TreeMenuNode
+type myTreeNode struct {
+ node *tree.TreeMenuNode
+}
+
+func (myNode *myTreeNode) postOrder() {
+
+ node := myTreeNode{myNode.node.Child}
+ node.postOrder()
+ treeNode := myTreeNode{myNode.node.Perent}
+ treeNode.postOrder()
+ myNode.node.Print()
+}
+
func main() {
var menu tree.TreeMenuNode
@@ -40,4 +59,18 @@ func main() {
menu.Traverse()
org.Traverse()
+ // 通过工厂获取
+ root := tree.CraeteTreeMenuNode("测试")
+ fmt.Println(root.Name)
+
+ root.Perent = tree.CraeteTreeMenuNode("1")
+
+ root.Child = tree.CraeteTreeMenuNode("2")
+
+ root.Perent.Perent = tree.CraeteTreeMenuNode("01")
+
+ root.Child.Child = tree.CraeteTreeMenuNode("02")
+
+ root.Perent.Print()
+
}