go二次學習基礎(2)

package main

import "fmt"

/*
	golang 數組 :把同一類元素放在一起的集合

	定義:1.[元素長度]元素類型{元素一, 元素二}  元素長度可以不填寫 用...代替
		 2. var a = new([長度]類型) a[i] = value

	func 1.len() 長度
		 2.cap() 容量 在數組中一般是對等的

	數組遍歷{
		for i := 0; i < len(arr); i++ { }
		for k,v := range arr {}
	}

	多緯數組
		er := [幾個數組][數組個數]數組類型{value}
*/

/*
	golang slice 切片是數組的一部分
	取值
		cl := a[:]  // 取a所有數據
		cl = a[0:2] // 前閉後開原則 可以取到前面 取不到後面
		cl = a[:2]  // 從開始取到指定位置 不包含指定位置
		cl = a[2:]  // 從指定位置取到最後
	增加
		cl = append(cl, 5) // append之後和原數組沒有關係了
	copy()
		將後面切片拷貝到前面的切片 會覆蓋
		copy(cl, cl1)
		copy(cl[3:4], cl1) 可以將後面數據複製到前面指定位置
	創建切片
		var a []int
		b := make([]int, 4) // var和make的區別是 var聲明出來的是空的 make聲明的是有默認值的
*/

/*
	golang map 類似於其他語言的字典或者哈希表 表現位 key-value
	聲明
		var m map[string]string   m = map[string]string{}
		m := map[string]string{}
		m = make(map[string]string)
		m := map[int]interface{}{}  聲明一個空接口就可以實現存儲各種value類型數據
	刪除
		delete(變量名, key)
	長度
		len() 擁有多少元素
	取值
		m[key]
		for k, v := range m { }

*/

/*
	golang func
	func funcname(input ...params)(output ...params) {
		func logic
		return output type params
	}

	return return返回值已經聲明不可以在函數內部重複 返回值如果不寫,go會找到函數內部的返回值名稱並返回

	匿名函數{
		ret := func(msg string) {
			fmt.Println(msg)
		}
		ret("hello world")
		fmt.Println("")
	}

	不定向參數
	func funcname(param1,param2 ...string) {} //不定向參數必須最後一位 傳入的是一個切片
	傳入切片時可以使用不定向傳參方式{
		sli := []string{"1", "2", "3"}
		funcname(data1, sli...)

	}

	自執行函數{
		(func(){
			fmt.Println("我不需要調用即可執行,從聲明那一刻我就自己執行了")
		})()
	}

	閉包函數 :函數返回一個函數就叫閉包函數
	{
		func mo()func(int){
			return func(num int) {
				// 我和外層函數返回類型(函數)一樣一樣的
			}
		}
		調用 mo()(4)
	}

	延遲調用函數
		defer
*/

/*
	golang 指針和地址 :指針指向變量原始內存地址 *聲明指針 &取地址
	定義{
		var a *int
		var a string = "i'm point"   p := &a  // := 隱式聲明指針
	}
	賦值{
		*a = 123
		var b int
		b = *a
	}
	取值{
		*a
	}

	數組指針{
		arr := [5]string{"1", "2", "3", "4", "5"}
		arrP = *[5]string
		arrP = &arr
	}

	指針數組{
		var arrpP *[5]string // 五個指針組成的數組
	}
*/

/*
	golang struct 結構體 : 可以存儲多個不同數據類型的數據類型
	聲明{
		type structName struct {
			dataName dataType
			dataName dataType
			...
		}
	}

	使用{
		1: var fx Lfx   // 可以用fx. 來調用fx裏面的數據類型 來賦值 改變 ...
		2: var fx Lfx{data...}
		3: fx := new(Lfx)
	}

	獲取數據{
		使用.即可使用類型裏面的數據
	}

	結構體指針{
		聲明{
			var fxp *Lfx
		}
		注意{
			*fxp.Name 會報錯 因爲有可能.的優先級比*高 加括號即可 (*fxp).Name
		}
	}

	結構體和其他類型的區別{
		可以掛載:(l *Lfx)Song(name string)(ret string)
	}
*/

/*
	golang interface  接口是一類規範 是某些方法的集合
	interface在go裏面實現了範型{
		範型:例:函數中用接口代替不確定類型 func MyFun(a interface{}) {}
	}

	goroutine 在調用一個方法的前面加上go就是goroutine 它會讓方法異步執行 相當於協程
	聲明{
		go funcName()
	}

	協程管理器{
		var wg sync.WaitGroup
		wg.Add(1)
		go Run(&wg)
		wg.Wait()
		// 在函數中傳遞參數 *sync.WaitGroup  函數內部用wg.Done()來中止協程
	}

	channel 是goroutine之間的通訊橋樑
	定義{
		1: c := make(chan int,1)   // 有緩衝區
		2: c := make(chan int)     // 無緩衝區
		3: var readc <-chan int = c // 可讀
		4: var write chan<- int = c // 可寫
		5:
	}
	關閉{
		close(c) //當不需要存儲數據的時候需要關閉
		當使用for range取值的時候 可以先close掉chan
	}
	select {
		select {
			case <-c: //多個條件符合則隨機執行
		}
	}

*/

func main() {
	c := make(chan int)
	var readc <-chan int = c
	var writec chan<- int = c

	go SetChan(writec)
	GetChan(readc)
}

func SetChan(writec chan<- int) {
	for i:=0; i<10; i++ {
		fmt.Println("i'm set func ")
		writec<- i
	}
}

func GetChan(readc <-chan int) {
	for i:=0; i<10; i++ {
		fmt.Printf("i'm get func i'm get %d \n", <-readc)
	}
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章