golang 知識點總結1

2021-10-23 17:30:24 字數 4072 閱讀 3527

我就不展開說要寫什麼了,最近在研讀**中的**,其中很多知識都是沒有接觸過的,就邊看邊學,最近積累了一些知識點,現在我把它總結一些,主要涉及的是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值,還有乙個標誌位(truefalse),在查詢的時候和遍歷的時候是不同的。

這兩個我覺得是比較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.字串 單引號 雙引號 當字串中包含單引號和雙引號時候,可以引用三引號 注意 三引號與單引號等有所區別,三引號也可以使用三個連續...