iT邦幫忙

0

Golang 每日一小時(Day7)

go
  • 分享至 

  • xImage
  •  

map 基本上就是 Python 的 dict,寫過 Python 跟 JavaScript 的我一直以為是 array 的那個 map...

type Vertex struct {
	Lat, Long float64
}

var m map[string]Vertex

func main() {
	m = make(map[string]Vertex)
	m["Bell Labs"] = Vertex{
		40.68433, -74.39967,
	}

檢查是否存在的寫法就特別一點,不常寫的我一定很容易忘記:

elem, ok = m[key]

if ok {
    fmt.Println("exist")
} else {
    fmt.Println("not exist")
}

基本上是個共通的概念,這邊就直接來做練習:

package main

import (
	"golang.org/x/tour/wc"
	"strings"
)

func WordCount(s string) map[string]int {
	m := make(map[string]int)
	
	for _, v := range strings.Fields(s){
		m[v]++
	}

	return m
}

func main() {
	wc.Test(WordCount)
}

赫然發現有 import 卻沒使用到的模組或宣告沒用到的變數都會在編譯時被擋,Go 真的是很嚴謹呢...

map 後面提到一些高階 function 的概念,首先是傳遞 function (我自己基本上都當成 callback 了),只能說宣告這種把 function 當變數的 function 真的是有夠麻煩的。

func compute(fn func(float64, float64) float64) float64 {
	return fn(3, 4)
}

甚至連 closure 都有介紹,還記得當初學了一陣子才懂,簡單來說就是會「存著外部變數的 function」,可以讀外面的變數,也可以改外面的變數。

package main

import "fmt"

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	pos, neg := adder(), adder()
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),
			neg(-2*i),
		)
	}
}

練習題也是經典的 Fibonacci 數列,可以像 Python 一樣 a, b = b, a 真是方便:

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
	x, y := 0, 1
	return func() int {
		res := x
		x, y = y, x+y
		return res
	}
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言