我就不展開說要寫什麼了,最近在研讀**中的**,其中很多知識都是沒有接觸過的,就邊看邊學,最近積累了一些知識點,現在我把它總結一些,主要涉及的是golang。
此函式是用來進行初始化工作的,在程式開始執行時按照宣告的順序被自動呼叫,比如說一些變數需要初始化,則可以採用這種方式,舉乙個在原始碼中的例子:
var profile string
var tls_eval bool
var split_to_buckets uint
func
init()
這裡的init
函式就對其上面宣告的變數進行了初始化,可能有的朋友看不懂函式中的內容,在這裡做簡單說明:
flag
包是用來解析命令列引數的,類似於os.ar**
以此類推,flag.***var
,都代表乙個意思,將該變數繫結到輸入的內容上,該內容的型別決定了***
的型別。
map時golang中的乙個無序的鍵值對的集合,是通過雜湊表來實現的。
for k,v := mapexample
mapexample :=
make
(map
[string
]int
)
在這裡我還想說一點,在原始碼中碰到的:
var parsed_json map
[string
]inte***ce
//反序列化成map
if json.
unmarshal([
]byte
(json_line)
,&parsed_json)
!=nil
//然後再取map中的元素
comsys_tool, ok := parsed_json[
"comsys-tool"].
(string)if
!ok
這時會返回兩個值乙個是key
鍵對應的value
值,還有乙個標誌位(true
,false
),在查詢的時候和遍歷的時候是不同的。
這兩個我覺得是比較golang中比較神秘的地方了,也是獨有的地方,體現出了golang的高效能,除此之外,介面應該也算乙個,這裡都不說它了,主要說一下這兩個東東。
按我的理解,我覺得學習這兩者,要了解作業系統這門知識點,當然如果沒學過當然也可以理解,因為沒有涉及太深的理論知識。
goroutine
是golang獨有的東西,我們可以叫它協程,可能大家都聽過程序,學過作業系統的還知道執行緒,但是協程是真的沒有聽過。
程序就是你電腦後台正在執行的程式嘛,你可以使用ctrl + alt + delete
,開啟任務管理器檢視。而執行緒是程序的乙個執行例項,乙個程序可以包含多個執行緒從而執行不同的任務。並且我們需要知道:
現在一般的電腦都是多核的,也就是具有多個cpu,在golang中可以使用runtime
包進行檢視:
package main
import
("fmt"
"runtime"
)func
main()
了解了這些,我們就清楚了好大一部分知識點了,離成功就不遠了。。。
golang中的協程就是執行緒上面的分支,是輕量級的執行緒,可以同時多協程,開啟的語句:go function_name
go協程的特點:
各乙個具體例子:
import
("fmt"
"strconv"
"time"
)func
test()
}func
main()
}
這樣有乙個問題就是無法兼顧協程和主線程的執行時間,因為協程是跟隨主線程的,如果主線程執行完畢,那麼協程將自動關閉。可以通過time.sleep
來相容,但是精度不夠。
package main
import
("fmt"
"sync"
"time"
)var
( mymap =
make
(map
[int
]int,10
) lock sync.mutex // 全域性互斥鎖
)func
test
(n int
)//加鎖
lock.
lock()
mymap[n]
= res
//解鎖
lock.
unlock()
}func
main()
time.
sleep
(time.second*5)
lock.
lock()
for i, v :=
range mymap
lock.
unlock()
}
多個協程同時開啟,對於test
函式的使用發生了阻塞,所以這裡提供了乙個解決辦法,通過lock sync.mutex 全域性互斥鎖
,來對test
以及map互斥使用,這樣我們就可以順利執行了。
利用channel可以解決協程之間的通訊問題,下面簡單介紹:
1、var intchan chan
int intchan =
make
(chan
int,3)
2、intchan :=
make
(chan
int,
3)
for v :=
range intchan
//channel沒有索引,所以只有返回值,而無下標
//寫入
intchan
10//寫出
value :=
另外提一下**中的乙個知識點:
func
line_from_stdin
(stdin_chan chan
string
)
表明
channel是單向的,只能用來接受資料。
將協程放到管道,多個協程操作同乙個管道時不會發生資源競爭問題,就是因為channel的特性。
給乙個實際例子:
package main
import
"fmt"
func
main()
用法:主要用於監聽和channel有關的i/o操作,當i/o操作發生時,觸發相應的動作:
定義:
json序列化,是將有key-value
結構的資料型別(結構體、map、slice)序列化成json字串的操作,反序列化相反。
主要通過encoding/json
包實現,裡面包含:
兩個包用於序列化和反序列化。
結構體序列化的別稱:
先給個例子:
type monster1 struct
比如這個結構體序列化的時候會使用其後面的別稱。
反序列化時,輸入有兩個部分:
mapint := make(map[string]inte***ce{})
inte***ce{}
代表任何型別,如果要轉換型別,則採用:a.(string)
常見知識點總結 1
1.獲得專案中info.plist檔案的內容 1 nsbundle mainbundle infodictionary 2 版本號在info.plist中的key kcfbundleversionkey 2.自定義控制器的view 重寫loadview方法 不需要呼叫 super loadview ...
c 知識點總結(1)
只有在 同一類定義中的同名成員函式才存在過載關係 主要特點是 函式的引數型別和數目有所不同 但 不能出現函式引數的個數和型別均相同 僅僅依靠返回值型別不同來區分的函式,這和普通函式的過載是完全一致的。另外,過載和成員函式是否是虛函式無關 覆蓋 在 派生類中覆蓋基類中的同名函式,要求兩個函式的 引數個...
python知識點總結 1
python 是python中的內建函式 2.在python中float相當與c語言中的double 3.python中的整數長度無上限 4.複數 complex 支援 5.字串 單引號 雙引號 當字串中包含單引號和雙引號時候,可以引用三引號 注意 三引號與單引號等有所區別,三引號也可以使用三個連續...