iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Software Development

什麼都不會還敢說你是 RD 啊?畢業後的後端入職前準備系列 第 29

【Day 29】學 Go 之路的小檢討 + concurrent merge sort

這篇文檢討一下學 Go 這幾天,
今天沒有一個學得很完整的東西可以分享(再加上好累#
想寫一個 concurrent 的 merge sort 一直不順,之後寫好會放回這篇

2021/10/15 更新:merge sort 寫好了,但不知道怎麼去設定 go runtime 的 parallel

今天做的事

  1. 看了一個 Coursera 影片,
    補了一點點 go concurrency 的東西到 goroutine 那篇。
    之後繼續看,希望幫助之後寫 concurrent 的 go 程式時少踩一點坑。

  2. 嘗試寫點東西

// 要先 import bufio 和 os
reader := bufio.NewReader(os.Stdin)
// ReadString 吃 byte 所以不能打 "\n"
// 記得放 _ 因為會回傳 error
newinput, _ := reader.ReadString('\n')

failed ^_^

  1. 稍微翻了幾個比較簡單的 repo
    simple-go-server
    1m-go-websockets
    除了語法要熟,也要熟悉一些基本 modules 例如 net/httplog 等,
    不然光看懂就很累了,怎麼還看得出用了啥 design patterns XD

另外就是小 repo 不太會用到 design patterns。
想學好的程式架構設計真的是一條漫漫長路,沒有太多捷徑呢。

小檢討

這幾天下來,覺得 syntax 熟悉度要多練,可能還是需要更多寫扣的時間。

因為熟悉度不夠,導致看程式碼時,尤其碰到 struct / interface 的地方,常常對於這裡要不要加 {} 各種問號
今天寫 merge sort 傳 array 也卡了

與其急著去瞭解更多的 modules,好像更該練習好基礎,之後才能自己實作呢。

Merge sort

沒用 goroutine

package main
import (
	"fmt"
	"math/rand"
	"time"
)
func Mergesort(arr []int)([]int) {
	if len(arr) < 2 {
		return arr
	}
	mid := len(arr) / 2
	return merge(Mergesort(arr[:mid]), Mergesort(arr[mid:]))
	
}
func merge(a1 []int, a2 []int)([]int){
	a:=[]int{}
	//fmt.Println(a1, a2, len(a1), len(a2))
	i, j := 0, 0
	for i < len(a1) && j < len(a2) {
		if a1[i] <= a2[j] {
			a = append(a, a1[i])
			i++
		} else if a1[i] > a2[j]{
			a = append(a, a2[j])
			j++
		}
		
	}
	for i < len(a1) {
		a = append(a, a1[i])
		i++
	}
	for j < len(a2) {
		a = append(a, a2[j])
		j++
	}
	//fmt.Println("a is ", a)
	return a

}
func main() {
	arr := []int{}
	rand.Seed(time.Now().UnixNano())
	// for i := 0; i < 10; i++ {
	// 	arr[i] = rand.Intn(100)
	// }
	arr = rand.Perm(20)
	fmt.Println(arr)
	newarr := Mergesort(arr)
	fmt.Println(newarr)
}

goroutine

package main
import (
	"fmt"
	"math/rand"
	"time"
)
func mergesort(arr []int, ch chan []int) {
	if len(arr) < 2 {
			ch <- arr
			return
	}
	mid := len(arr) / 2
	ch1, ch2 := make(chan []int), make(chan []int)
	go mergesort(arr[:mid], ch1)
	go mergesort(arr[mid:], ch2)
	
	ch <- merge(<-ch1, <-ch2)	
}
func merge(a1 []int, a2 []int)([]int){
	// 同上,此略
}
func main() {
	arr := []int{}
	rand.Seed(time.Now().UnixNano())
	arr = rand.Perm(100)
	fmt.Println("unsorted array: ", arr)
	ch := make(chan []int, 0)
    // 這邊忘記開一個 goroutine 結果導致 deadlock XD
	go mergesort(arr, ch)
	newarr := <-ch
	fmt.Println("sorted array: ", newarr)
}

上一篇
【Day 28】Design Patterns with Go II:Prototype, Singleton, Facade
下一篇
【Day 30】接下來要繼續做的事 + 還沒完成的 WaitGroup 版 Merge Sort
系列文
什麼都不會還敢說你是 RD 啊?畢業後的後端入職前準備31

尚未有邦友留言

立即登入留言