File tree

7 files changed

+325
-22
lines changed

7 files changed

+325
-22
lines changed
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,39 @@ error可以假装理解为内置的类型(实际是接口),返回时errors.New("
237237
- 类函数
238238

239239
- interface
240+
```go
241+
242+
package main
243+
244+
import "fmt"
245+
246+
type Animal interface {
247+
Grow()
248+
Move(string) string
249+
}
250+
type Cat struct{
251+
Name string
252+
Age int32
253+
Address string
254+
}
255+
func (cat *Cat) Grow(){
256+
cat.Age++
257+
}
258+
func (cat *Cat)Move(newAdddress string)(oldAddress string){
259+
oldAddress = cat.Address
260+
cat.Address = newAdddress
261+
return
262+
}
263+
264+
func main() {
265+
myCat := Cat{"Little C", 2, "In the house"}
266+
animal, ok := interface{}(&myCat).(Animal)
267+
animal.Grow()
268+
fmt.Printf("%v, %v\n", ok, animal)
269+
}
270+
true, &{Little C 3 In the house}
271+
272+
```
240273
>按照约定,只包含一个方法的接口应当以该方法的名称加上-er后缀或类似的修饰来构造一个施动着名词,如 Reader、Writer、 Formatter、CloseNotifier 等。
241274
242275
## defer
@@ -253,13 +286,156 @@ defer file.Close()
253286
```
254287

255288
## go
256-
289+
go 相当轻量级线程,其实是croutine的go实现.相当golang语言本身集成了线程库的一些工程.
257290
## chan
258-
291+
简单理解:通道的目的就是为了go程序线程同步用的
259292
## make
260293
>内建函数 make(T, args) 的目的不同于 new(T)。它只用于创建切片、映射和信道,并返回类型为 T(而非 *T)的一个已初始化 (而非置零)的值。 出现这种用差异的原因在于,这三种类型本质上为引用数据类型,它们在使用前必须初始化。 例如,切片是一个具有三项内容的描述符,包含一个指向(数组内部)数据的指针、长度以及容量, 在这三项被初始化之前,该切片为 nil。对于切片、映射和信道,make 用于初始化其内部的数据结构并准备好将要使用的值。
261294
295+
go chan make slice 综合小例子
296+
```go
297+
298+
package main
299+
300+
import "fmt"
301+
302+
func sum(a []int, c chan int) {
303+
sum := 0
304+
for _, v := range a {
305+
sum += v
306+
}
307+
c <- sum //将和送入c
308+
}
309+
310+
func main() {
311+
a := []int{1, 2, 3, 4, 5, 6}
312+
313+
c := make(chan int)
314+
315+
go sum(a[len(a)/2:], c)
316+
go sum(a[:len(a)/2], c)
317+
318+
x, y := <-c, <-c //从c中获取
319+
320+
fmt.Println(x,"+", y,"=", x+y)
321+
}
322+
323+
324+
```
262325
## 恐慌panic与恢复recover
326+
类似c++,java中的异常.panic就是抛出异常,recover就是捕获异常.
327+
```go
328+
329+
package main
330+
331+
import (
332+
"errors"
333+
"fmt"
334+
)
335+
336+
func innerFunc() {
337+
defer func(){ //尝试移动本段代码查看效果
338+
if p:=recover(); p!=nil{
339+
fmt.Printf("Fatal error: %s\n",p)
340+
}
341+
}()
342+
fmt.Println("Enter innerFunc")
343+
panic(errors.New("Occur a panic!"))
344+
fmt.Println("Quit innerFunc")
345+
}
346+
347+
func outerFunc() {
348+
349+
fmt.Println("Enter outerFunc")
350+
innerFunc()
351+
fmt.Println("Quit outerFunc")
352+
}
353+
354+
func main() {
355+
fmt.Println("Enter main")
356+
outerFunc()
357+
fmt.Println("Quit main")
358+
}
359+
360+
Enter main
361+
Enter outerFunc
362+
Enter innerFunc
363+
Fatal error: Occur a panic!
364+
Quit outerFunc
365+
Quit main
366+
367+
368+
```
369+
370+
# 第三章 从写些小工具开始
371+
372+
- 字符串操作
373+
```go
374+
375+
package main
376+
377+
import (
378+
"fmt"
379+
"strings"
380+
)
381+
382+
func main() {
383+
name := "harry potty"
384+
arr := strings.Split(name, " ")
385+
fmt.Println(arr)
386+
arr2 := strings.Join(arr, "#")
387+
fmt.Println(arr2)
388+
str := strings.Replace(name, "harry", "\\t", -1)
389+
fmt.Println(str)
390+
}
391+
392+
[harry potty]
393+
harry#potty
394+
\t potty
395+
396+
397+
```
398+
- json操作
399+
400+
```go
401+
402+
package main
403+
404+
import (
405+
"encoding/json"
406+
"fmt"
407+
)
408+
409+
type Person struct {
410+
Name string
411+
Age int
412+
}
413+
type Girl struct {
414+
Person Person
415+
Sex bool
416+
}
417+
418+
func main() {
419+
defer func() {
420+
fmt.Println("程序结束了")
421+
}()
422+
person := Person{"胡彦春", 18}
423+
gilr := Girl{person, true}
424+
b, err := json.Marshal(gilr)
425+
if err != nil {
426+
fmt.Print(err)
427+
}
428+
fmt.Print(string(b))
429+
430+
}
431+
432+
{"Person":{"Name":"胡彦春","Age":18},"Sex":true}程序结束了
433+
434+
```
435+
436+
- 文件操作
437+
438+
- websocket
263439

264-
# 第三章 从写个工具开始
440+
- options
265441

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func sum(a []int, c chan int) {
6+
sum := 0
7+
for _, v := range a {
8+
sum += v
9+
}
10+
c <- sum //将和送入c
11+
}
12+
13+
func main() {
14+
a := []int{1, 2, 3, 4, 5, 6}
15+
16+
c := make(chan int)
17+
18+
go sum(a[len(a)/2:], c)
19+
go sum(a[:len(a)/2], c)
20+
21+
x, y := <-c, <-c //从c中获取
22+
23+
fmt.Println(x, "+", y, "=", x+y)
24+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package main
22

33
import (
4-
"fmt"
54
"errors"
5+
"fmt"
66
)
77

88
type PersonBase struct {
@@ -14,21 +14,21 @@ type Boy struct {
1414
Sex string
1515
}
1616

17-
func Add(addA int, addB int) (int, error){
18-
if addA==0 {
19-
return 0,errors.New("第一个参数不能为0")
17+
func Add(addA int, addB int) (int, error) {
18+
if addA == 0 {
19+
return 0, errors.New("第一个参数不能为0")
2020
}
2121
result := addA + addB
22-
return result,nil
22+
return result, nil
2323
}
24-
func test(slice []string)(){
25-
slice[2]="y"
24+
func test(slice []string) {
25+
slice[2] = "y"
2626
return
2727
}
2828
func main() {
2929
fmt.Println("Hello Golang")
3030

31-
result,err := Add(0,10)
31+
result, err := Add(0, 10)
3232
if err != nil {
3333
fmt.Println(err)
3434
}
@@ -45,26 +45,25 @@ func main() {
4545
personP.Name = "gaofei"
4646
personP.Age = 27
4747

48-
arr :=[...] int {1,2,3,4,5}
49-
for i,v:= range arr{
48+
arr := [...]int{1, 2, 3, 4, 5}
49+
for i, v := range arr {
5050
fmt.Println("index:", i, "value:", v)
5151
}
52-
m := map[int]string{1:"one", 2:"two"}
53-
for i,v:= range m{
52+
m := map[int]string{1: "one", 2: "two"}
53+
for i, v := range m {
5454
fmt.Println("index:", i, "value:", v)
5555
}
56-
s := []string{"1","2","3"}
57-
s1:= s;
58-
for i,v:=range s {
56+
s := []string{"1", "2", "3"}
57+
s1 := s
58+
for i, v := range s {
5959
fmt.Println(i, v)
6060
}
61-
s1[2]="w";
62-
for i,v:=range s {
61+
s1[2] = "w"
62+
for i, v := range s {
6363
fmt.Println(i, v)
6464
}
6565
test(s1)
66-
for i,v:=range s {
66+
for i, v := range s {
6767
fmt.Println(i, v)
6868
}
6969
}
70-
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package main
2+
3+
import "fmt"
4+
5+
type Animal interface {
6+
Grow()
7+
Move(string) string
8+
}
9+
type Cat struct {
10+
Name string
11+
Age int32
12+
Address string
13+
}
14+
15+
func (cat *Cat) Grow() {
16+
cat.Age++
17+
}
18+
func (cat *Cat) Move(newAdddress string) (oldAddress string) {
19+
oldAddress = cat.Address
20+
cat.Address = newAdddress
21+
return
22+
}
23+
24+
func main() {
25+
myCat := Cat{"Little C", 2, "In the house"}
26+
animal, ok := interface{}(&myCat).(Animal)
27+
animal.Grow()
28+
fmt.Printf("%v, %v\n", ok, animal)
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
)
7+
8+
type Person struct {
9+
Name string
10+
Age int
11+
}
12+
type Girl struct {
13+
Person Person
14+
Sex bool
15+
}
16+
17+
func main() {
18+
defer func() {
19+
fmt.Println("程序结束了")
20+
}()
21+
person := Person{"胡彦春", 18}
22+
gilr := Girl{person, true}
23+
b, err := json.Marshal(gilr)
24+
if err != nil {
25+
fmt.Print(err)
26+
}
27+
fmt.Print(string(b))
28+
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
)
7+
8+
func innerFunc() {
9+
defer func() {
10+
if p := recover(); p != nil {
11+
fmt.Printf("Fatal error: %s\n", p)
12+
}
13+
}()
14+
fmt.Println("Enter innerFunc")
15+
panic(errors.New("Occur a panic!"))
16+
fmt.Println("Quit innerFunc")
17+
}
18+
19+
func outerFunc() {
20+
21+
fmt.Println("Enter outerFunc")
22+
innerFunc()
23+
fmt.Println("Quit outerFunc")
24+
}
25+
26+
func main() {
27+
fmt.Println("Enter main")
28+
outerFunc()
29+
fmt.Println("Quit main")
30+
}

0 commit comments

Comments
 (0)