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