Sync
This commit is contained in:
parent
cd080ddda2
commit
ba7812bfdd
@ -1,12 +0,0 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
var i interface{} = "hello"
|
||||
|
||||
s := i.(string)
|
||||
fmt.Println(s)
|
||||
|
||||
fmt.Printf("%v- %T\n", s, s)
|
||||
}
|
||||
29
tour_of_go/l5/exercise-images/exercise-images.go
Normal file
29
tour_of_go/l5/exercise-images/exercise-images.go
Normal file
@ -0,0 +1,29 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"golang.org/x/tour/pic"
|
||||
"image"
|
||||
"image/color"
|
||||
)
|
||||
|
||||
type Image struct{
|
||||
w, h int
|
||||
}
|
||||
|
||||
func (i Image) Bounds() image.Rectangle {
|
||||
return image.Rect(0, 0, i.w, i.h)
|
||||
}
|
||||
|
||||
func (i Image) ColorModel() color.Model {
|
||||
return color.RGBAModel
|
||||
}
|
||||
|
||||
func (i Image) At(x, y int) color.Color {
|
||||
v := uint8(x^y)
|
||||
return color.RGBA{v, v, 255, 255}
|
||||
}
|
||||
|
||||
func main() {
|
||||
m := Image{320, 240}
|
||||
pic.ShowImage(m)
|
||||
}
|
||||
5
tour_of_go/l5/exercise-images/go.mod
Normal file
5
tour_of_go/l5/exercise-images/go.mod
Normal file
@ -0,0 +1,5 @@
|
||||
module exercise-images.go
|
||||
|
||||
go 1.24.5
|
||||
|
||||
require golang.org/x/tour v0.1.0
|
||||
2
tour_of_go/l5/exercise-images/go.sum
Normal file
2
tour_of_go/l5/exercise-images/go.sum
Normal file
@ -0,0 +1,2 @@
|
||||
golang.org/x/tour v0.1.0 h1:OWzbINRoGf1wwBhKdFDpYwM88NM0d1SL/Nj6PagS6YE=
|
||||
golang.org/x/tour v0.1.0/go.mod h1:DUZC6G8mR1AXgXy73r8qt/G5RsefKIlSj6jBMc8b9Wc=
|
||||
12
tour_of_go/l5/images.go
Normal file
12
tour_of_go/l5/images.go
Normal file
@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"image"
|
||||
)
|
||||
|
||||
func main() {
|
||||
m := image.NewRGBA(image.Rect(0, 0, 100, 100))
|
||||
fmt.Println(m.Bounds())
|
||||
fmt.Println(m.At(0, 0).RGBA())
|
||||
}
|
||||
36
tour_of_go/l6/generics.go
Normal file
36
tour_of_go/l6/generics.go
Normal file
@ -0,0 +1,36 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type List[T any] struct {
|
||||
next *List[T]
|
||||
val T
|
||||
}
|
||||
|
||||
func (l *List[T]) Prepend(v T) *List[T] {
|
||||
return &List[T]{next: l, val: v}
|
||||
}
|
||||
|
||||
func (l *List[t]) Len() int {
|
||||
count := 0
|
||||
for cur := l; cur != nil; cur = cur.next {
|
||||
count++
|
||||
}
|
||||
return count
|
||||
}
|
||||
|
||||
func main() {
|
||||
var test_list *List[int]
|
||||
fmt.Println(test_list)
|
||||
test_list = test_list.Prepend(10)
|
||||
fmt.Println(test_list)
|
||||
test_list = test_list.Prepend(20)
|
||||
fmt.Println(test_list)
|
||||
fmt.Printf("The list has %d items\n", test_list.Len())
|
||||
test_list = test_list.Prepend(30)
|
||||
fmt.Println(test_list)
|
||||
|
||||
fmt.Printf("The list has %d items", test_list.Len())
|
||||
}
|
||||
20
tour_of_go/l6/index.go
Normal file
20
tour_of_go/l6/index.go
Normal file
@ -0,0 +1,20 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func Index[T comparable](s []T, x T) int {
|
||||
for i, v := range s {
|
||||
if v == x {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func main() {
|
||||
si := []int{10, 20, 15, -10}
|
||||
fmt.Println(Index(si, 15))
|
||||
|
||||
ss := []string{"foo", "bar", "bax"}
|
||||
fmt.Println(Index(ss, "hello"))
|
||||
}
|
||||
12
tour_of_go/l7/buffered-channels.go
Normal file
12
tour_of_go/l7/buffered-channels.go
Normal file
@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
ch := make(chan int, 2)
|
||||
ch <- 1
|
||||
ch <- 2
|
||||
// ch <- 3
|
||||
fmt.Println(<-ch)
|
||||
fmt.Println(<-ch)
|
||||
}
|
||||
22
tour_of_go/l7/channels.go
Normal file
22
tour_of_go/l7/channels.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func sum(s []int, c chan int) {
|
||||
sum := 0
|
||||
for _, v := range s {
|
||||
sum += v
|
||||
}
|
||||
c <- sum // Send the sum into the channel
|
||||
}
|
||||
|
||||
func main() {
|
||||
s := []int{7, 2, 8, -8, 4, 0}
|
||||
|
||||
c := make(chan int)
|
||||
go sum(s[:len(s)/2], c)
|
||||
go sum(s[len(s)/2:], c)
|
||||
x, y := <-c, <-c // Receive from the channel
|
||||
|
||||
fmt.Println(x, y, x+y)
|
||||
}
|
||||
27
tour_of_go/l7/default-selection.go
Normal file
27
tour_of_go/l7/default-selection.go
Normal file
@ -0,0 +1,27 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
start := time.Now()
|
||||
tick := time.Tick(100 * time.Millisecond)
|
||||
boom := time.After(500 * time.Millisecond)
|
||||
elapsed := func() time.Duration {
|
||||
return time.Since(start).Round(time.Millisecond)
|
||||
}
|
||||
for {
|
||||
select {
|
||||
case <- tick:
|
||||
fmt.Printf("[%6s] tick.\n", elapsed())
|
||||
case <- boom:
|
||||
fmt.Printf("[%6s] BOOM!\n", elapsed())
|
||||
return
|
||||
default:
|
||||
fmt.Printf("[%6s] .\n", elapsed())
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
}
|
||||
}
|
||||
58
tour_of_go/l7/exercise-binary-tree.go
Normal file
58
tour_of_go/l7/exercise-binary-tree.go
Normal file
@ -0,0 +1,58 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"golang.org/x/tour/tree"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// type Tree struct {
|
||||
// Left *Tree
|
||||
// Value int
|
||||
// Right *Tree
|
||||
// }
|
||||
|
||||
func Walk(t *tree.Tree, ch chan int) {
|
||||
defer close(ch)
|
||||
var walker func(t *tree.Tree)
|
||||
walker = func (t *tree.Tree) {
|
||||
if t == nil {
|
||||
return
|
||||
}
|
||||
walker(t.Left)
|
||||
ch <- t.Value
|
||||
walker(t.Right)
|
||||
}
|
||||
walker(t)
|
||||
}
|
||||
|
||||
func Same(t1, t2 *tree.Tree) bool {
|
||||
ch1 := make(chan int)
|
||||
ch2 := make(chan int)
|
||||
|
||||
go Walk(t1, ch1)
|
||||
go Walk(t2, ch2)
|
||||
for i := range ch1 {
|
||||
v := <- ch2
|
||||
if i != v {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func main() {
|
||||
ch := make(chan int)
|
||||
fmt.Println("START")
|
||||
// Create two trees
|
||||
t1 := tree.New(2)
|
||||
t2 := tree.New(2)
|
||||
t3 := tree.New(3)
|
||||
go Walk(t1, ch)
|
||||
for i := range ch {
|
||||
fmt.Println(i)
|
||||
}
|
||||
|
||||
same_1 := Same(t1, t2)
|
||||
same_2 := Same(t2, t3)
|
||||
fmt.Println(same_1, same_2)
|
||||
}
|
||||
5
tour_of_go/l7/go.mod
Normal file
5
tour_of_go/l7/go.mod
Normal file
@ -0,0 +1,5 @@
|
||||
module exercise-binary-tree.go
|
||||
|
||||
go 1.24.5
|
||||
|
||||
require golang.org/x/tour v0.1.0
|
||||
2
tour_of_go/l7/go.sum
Normal file
2
tour_of_go/l7/go.sum
Normal file
@ -0,0 +1,2 @@
|
||||
golang.org/x/tour v0.1.0 h1:OWzbINRoGf1wwBhKdFDpYwM88NM0d1SL/Nj6PagS6YE=
|
||||
golang.org/x/tour v0.1.0/go.mod h1:DUZC6G8mR1AXgXy73r8qt/G5RsefKIlSj6jBMc8b9Wc=
|
||||
18
tour_of_go/l7/goroutines.go
Normal file
18
tour_of_go/l7/goroutines.go
Normal file
@ -0,0 +1,18 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
func say(s string) {
|
||||
for i := 0; i < 5; i++ {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
fmt.Println(s)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
go say("hello")
|
||||
say("world")
|
||||
}
|
||||
33
tour_of_go/l7/mutex-couter.go
Normal file
33
tour_of_go/l7/mutex-couter.go
Normal file
@ -0,0 +1,33 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type SafeCounter struct {
|
||||
mu sync.Mutex
|
||||
v map[string]int
|
||||
}
|
||||
|
||||
func (c *SafeCounter) Inc(key string) {
|
||||
c.mu.Lock()
|
||||
c.v[key]++
|
||||
c.mu.Unlock()
|
||||
}
|
||||
|
||||
func (c *SafeCounter) Value(key string) int {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
return c.v[key]
|
||||
}
|
||||
|
||||
func main() {
|
||||
c := SafeCounter{v: make(map[string]int)}
|
||||
for i := 0; i < 1000; i++ {
|
||||
go c.Inc("somekey")
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
fmt.Println(c.Value("somekey"))
|
||||
}
|
||||
23
tour_of_go/l7/range-and-close.go
Normal file
23
tour_of_go/l7/range-and-close.go
Normal file
@ -0,0 +1,23 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func fibonacci(n int, c chan int) {
|
||||
x, y := 0, 1
|
||||
for i := 0; i < n; i++ {
|
||||
c <- x
|
||||
x, y = y, x+y
|
||||
}
|
||||
close(c)
|
||||
}
|
||||
|
||||
func main() {
|
||||
c := make(chan int, 10)
|
||||
fmt.Printf("The channel's capacity is %d", cap(c))
|
||||
go fibonacci(cap(c), c)
|
||||
for i := range c {
|
||||
fmt.Println(i)
|
||||
}
|
||||
}
|
||||
28
tour_of_go/l7/select.go
Normal file
28
tour_of_go/l7/select.go
Normal file
@ -0,0 +1,28 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func fibonacci(c, quit chan int) {
|
||||
x, y := 0, 1
|
||||
for {
|
||||
select {
|
||||
case c <- x:
|
||||
x,y = y, x+y
|
||||
case <- quit:
|
||||
fmt.Println("quit")
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
c := make(chan int)
|
||||
quit := make(chan int)
|
||||
go func() {
|
||||
for i := 0; i < 10; i++ {
|
||||
fmt.Println(<-c)
|
||||
}
|
||||
quit <- 0
|
||||
}()
|
||||
fibonacci(c, quit)
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user