Skip to content

Commit b5ecc0d

Browse files
committed
learn(GoProgrammingFromBeginnerToMaster): 1-30
1 parent d4f5096 commit b5ecc0d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+883
-91
lines changed

.vscode/launch.json

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "Launch file",
9+
"type": "go",
10+
"request": "launch",
11+
"mode": "debug",
12+
"program": "${file}",
13+
// "args": ["1.jpg"]
14+
}
15+
]
16+
}

chapter3/sources/control_structure_idiom_3.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ func main() {
1212

1313
//byte sequence of s: 0xe4 0xb8 0xad 0xe5 0x9b 0xbd 0xe4 0xba 0xba
1414
var sl = []byte{0xe4, 0xb8, 0xad, 0xe5, 0x9b, 0xbd, 0xe4, 0xba, 0xba}
15+
fmt.Println(string(sl))
1516
for _, v := range sl {
1617
fmt.Printf("0x%x ", v)
1718
}
@@ -20,7 +21,8 @@ func main() {
2021
sl[3] = 0xd0
2122
sl[4] = 0xd6
2223
sl[5] = 0xb9
23-
24+
sl2 := []byte{0xd6, 0xb9}
25+
fmt.Printf("%v - %v - %x - %b - %c\n", []rune(string(sl2)), string(sl2), sl2, sl2, sl2)
2426
for i, v := range string(sl) {
2527
fmt.Printf("%d %x\n", i, v)
2628
}

chapter3/sources/control_structure_idiom_4.go

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func main() {
2323
fmt.Println(k, v)
2424
}
2525
fmt.Println("counter is ", counter)
26+
fmt.Println("final:", m)
2627
fmt.Println("\n")
2728

2829
m["tony"] = 21
@@ -36,4 +37,5 @@ func main() {
3637
fmt.Println(k, v)
3738
}
3839
fmt.Println("counter is ", counter)
40+
fmt.Println("final:", m)
3941
}

chapter3/sources/control_structure_idiom_6.go

+33-2
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@ import (
55
"time"
66
)
77

8-
func main() {
8+
func ShowBreakAtWhere() {
99
exit := make(chan interface{})
1010

1111
go func() {
12+
// loop:
1213
for {
1314
select {
1415
case <-time.After(time.Second):
1516
fmt.Println("tick")
1617
case <-exit:
1718
fmt.Println("exiting...")
18-
break
19+
// break loop
20+
break // break outside the select, not the for
1921
}
2022
}
2123
fmt.Println("exit!")
@@ -27,3 +29,32 @@ func main() {
2729
// wait child goroutine exit
2830
time.Sleep(3 * time.Second)
2931
}
32+
33+
func ShowLabelLoop() {
34+
final_sl := [][]int{}
35+
outLoop:
36+
for i := 0; i < 10; i++ {
37+
sl := []int{}
38+
fmt.Printf("sl len: %d sl cap: %d\n", len(sl), cap(sl))
39+
for j := 0; j < 10; j++ {
40+
if i >= 5 {
41+
break outLoop
42+
}
43+
if j >= 5 {
44+
continue outLoop
45+
}
46+
// fmt.Printf("%d * %d = %d\n", i, j, i*j)
47+
sl = append(sl, i*j)
48+
}
49+
fmt.Println(sl)
50+
final_sl = append(final_sl, sl)
51+
}
52+
fmt.Println(final_sl)
53+
}
54+
55+
func main() {
56+
// ShowLabelLoop()
57+
sl := []int{}
58+
sl = append(sl, 1)
59+
fmt.Println(sl)
60+
}

chapter3/sources/evaluation_order_8.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,33 @@ func getANumToChannel() int {
3333
return 2
3434
}
3535

36-
func main() {
36+
func Show() {
3737
select {
3838
//recv from channel
3939
case (getASlice())[0] = <-getAReadOnlyChannel():
4040
fmt.Println("recv something from a readonly channel")
41+
fmt.Println(getASlice())
4142

4243
//send to channel
4344
case getAWriteOnlyChannel() <- getANumToChannel():
4445
fmt.Println("send something to a writeonly channel")
4546
}
4647
}
48+
49+
func Show2(i int) {
50+
switch i {
51+
case 1:
52+
fmt.Println(1)
53+
fallthrough
54+
case 2:
55+
fmt.Println(2)
56+
fallthrough
57+
default:
58+
fmt.Println(-1)
59+
}
60+
}
61+
62+
func main() {
63+
i := 1
64+
Show2(i)
65+
}

chapter3/sources/for_range_bench_test.go

+19-16
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,45 @@ package array_test
22

33
import "testing"
44

5-
var a [100]int
5+
var a [10000]int
66
var sl = a[:]
77

8-
func arrayRangeLoop() {
8+
func arrayLoop() {
9+
910
var sum int
10-
for _, n := range a {
11-
sum += n
11+
for _, v := range a {
12+
sum += v
1213
}
1314
}
1415

15-
func pointerToArrayRangeLoop() {
16+
func arrayPointLoop() {
1617
var sum int
17-
for _, n := range &a {
18-
sum += n
18+
for _, v := range &a {
19+
sum += v
1920
}
2021
}
2122

22-
func sliceRangeLoop() {
23+
func arraySliceLoop() {
2324
var sum int
24-
for _, n := range sl {
25-
sum += n
25+
for _, v := range sl {
26+
sum += v
2627
}
2728
}
2829

29-
func BenchmarkArrayRangeLoop(b *testing.B) {
30+
func BenchmarkArrayLoop(b *testing.B) {
3031
for i := 0; i < b.N; i++ {
31-
arrayRangeLoop()
32+
arrayLoop()
3233
}
3334
}
34-
func BenchmarkPointerToArrayRangeLoop(b *testing.B) {
35+
36+
func BenchmarkArrayPointLoop(b *testing.B) {
3537
for i := 0; i < b.N; i++ {
36-
pointerToArrayRangeLoop()
38+
arrayPointLoop()
3739
}
3840
}
39-
func BenchmarkSliceRangeLoop(b *testing.B) {
41+
42+
func BenchmarkArraySliceLoop(b *testing.B) {
4043
for i := 0; i < b.N; i++ {
41-
sliceRangeLoop()
44+
arraySliceLoop()
4245
}
4346
}

chapter3/sources/item16-demo/chapter3-demo1/cmd/app2/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package main
22

33
import (
4-
mypkg2 "github.com/bigwhite/effective-go-book/chapter2-demo1/pkg/pkg2"
4+
mypkg2 "github.com/bigwhite/effective-go-book/chapter3-demo1/pkg/pkg2"
55
)
66

77
func main() {

chapter3/sources/main.go

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
)
7+
8+
type Status uint32
9+
10+
const (
11+
Open Status = iota
12+
Closed
13+
)
14+
15+
func ShowNilInterface() {
16+
var p *int
17+
var i interface{} = p
18+
if i == nil {
19+
fmt.Println("i = nil")
20+
return
21+
}
22+
fmt.Printf("%v != nil, type: %T,\n i's value: %v, i's type: %s\n", i, i, reflect.ValueOf(i), reflect.TypeOf(i).String())
23+
}
24+
25+
type MyStruct struct {
26+
Name string
27+
nickname string
28+
}
29+
30+
func ShowFuncListIteration() {
31+
type f func()
32+
33+
f1 := func() {
34+
fmt.Println("call f1")
35+
}
36+
37+
f2 := func() {
38+
fmt.Println("call f2")
39+
}
40+
funcs := []f{f1, f2}
41+
for _, v := range funcs {
42+
v()
43+
}
44+
45+
funcs_m := map[string]f{
46+
"f1": f1,
47+
"f2": f2,
48+
}
49+
for k, v := range funcs_m {
50+
fmt.Println(k)
51+
v()
52+
}
53+
funcs_m["f2"]()
54+
}
55+
56+
func main() {
57+
// fmt.Println("open: ", Open)
58+
// var v *net.IPAddr
59+
// fmt.Printf("v: %v\n", v)
60+
// var b bytes.Buffer
61+
// _, _ = b.Write([]byte("Hello"))
62+
// fmt.Println(b.String())
63+
64+
// s := MyStruct{Name: "shen"}
65+
// fmt.Printf("%#v\n", s)
66+
67+
// i := []int{'a': 1, 'b': 2}
68+
// fmt.Printf("i: %#v cap: %d char b: %d\n", i, cap(i), 'b')
69+
// m := map[string]int64{
70+
// "us": int64(time.Nanosecond),
71+
// // "us": int64(time.Nanosecond),
72+
// "µs": int64(time.Microsecond), // U+00B5 = micro symbol
73+
// "μs": int64(time.Microsecond),
74+
// }
75+
76+
// fmt.Printf("%#v\n", m)
77+
// fmt.Printf("%q == %q: %v\n", "µs", "µs", "µs" == "µs")
78+
79+
// ShowFuncListIteration()
80+
}

chapter3/sources/map_concurrent_read_and_write.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ func main() {
3131

3232
go func() {
3333
for i := 0; i < 1000; i++ {
34-
doWrite(m)
34+
doIteration(m)
3535
}
3636
}()
37-
37+
p := m[1]
38+
fmt.Println(p)
3839
time.Sleep(5 * time.Second)
3940
}

chapter3/sources/map_multiple_iterate.go

+4
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ func main() {
2020
for i := 0; i < 3; i++ {
2121
doIteration(m)
2222
}
23+
24+
for k, _ := range m {
25+
fmt.Println("k: ", k)
26+
}
2327
}

chapter3/sources/map_stable_iterate.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import "fmt"
55
func doIteration(sl []int, m map[int]int) {
66
fmt.Printf("{ ")
77
for _, k := range sl {
8-
v, ok := m[k]
8+
v, ok := m[k] // keep the order
99
if !ok {
1010
continue
1111
}
@@ -25,7 +25,7 @@ func main() {
2525
for k, _ := range m {
2626
sl = append(sl, k)
2727
}
28-
28+
fmt.Println(sl)
2929
for i := 0; i < 3; i++ {
3030
doIteration(sl, m)
3131
}

chapter3/sources/string_for_range_covert_optimize.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
func convert() {
99
s := "中国欢迎您,北京欢迎您"
1010
sl := []byte(s)
11+
fmt.Println(string(sl))
1112
for _, v := range sl {
1213
_ = v
1314
}
@@ -21,5 +22,5 @@ func convertWithOptimize() {
2122

2223
func main() {
2324
fmt.Println(testing.AllocsPerRun(1, convert))
24-
fmt.Println(testing.AllocsPerRun(1, convertWithOptimize))
25+
// fmt.Println(testing.AllocsPerRun(1, convertWithOptimize))
2526
}

chapter4/sources/1.jpg

48.5 KB
Loading

chapter4/sources/deferred_func_8.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
)
46

57
func foo1() {
68
sl := []int{1, 2, 3}
@@ -11,6 +13,7 @@ func foo1() {
1113
sl = []int{3, 2, 1}
1214
_ = sl
1315
}
16+
1417
func foo2() {
1518
sl := []int{1, 2, 3}
1619
defer func(p *[]int) {

chapter4/sources/deferred_func_9.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func trace(s string) string {
8+
fmt.Println("enter: ", s)
9+
return s
10+
}
11+
12+
func un(s string) {
13+
fmt.Println("leave: ", s)
14+
}
15+
16+
func a() {
17+
defer un(trace("a"))
18+
fmt.Println("in: a")
19+
}
20+
21+
func b() {
22+
defer un(trace("b"))
23+
fmt.Println("in: b")
24+
a()
25+
}
26+
27+
func main() {
28+
b()
29+
}

0 commit comments

Comments
 (0)