【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)
}

<<:  [第三十天]从0开始的UnityAR手机游戏开发-另一个物体碰到小龙时会扣血的脚本和後记

>>:  【在厨房想30天的演算法】Day 29 资讯安全与演算法 : 数位签章

[Day09] Tableau 轻松学 - Data Source 页面

前言 若实作中遇到与资料来源有关的设定,会回到 Data Source 页面来做调整,因此在进入实作...

[Day18] - 在 React 中引用现成的 Web Component

当我们拿到一个现有的 Web Component 时 , 如何在 React 专案中引用呢 ? 利用...

Firebase Web的小功能分享 (1)

由於很多人都写了要怎麽创建专案、开启专案,这边就来分享一下我写的一些小功能: 上传档案後制作超连结下...

[从0到1] C#小乳牛 练成基础程序逻辑 Day 21 - Array 常数const

拉钩上吊 一百年不许变 | 中括号[] | const下好离手 ...

Day30 WebRTC 一对多连线

上一篇我们使用 addTransceiver 单向接收串流 ,但是却不能两个人一起接收,今天我们要来...