Golang精編100題
能力模型
| 級別 | 模型 |
| --- | --- |
| 初級 primary | 熟悉基本語法,能夠看懂代碼的意圖; 在他人指導下能夠完成用戶故事的開發,編寫的代碼符合CleanCode規范; |
|中級 intermediate|能夠獨立完成用戶故事的開發和測試;能夠嗅出代碼的壞味道,并知道如何重構達成目標;|
|高級 senior|能夠開發出高質量高性能的代碼;能夠熟練使用高級特性,開發編程框架或測試框架;|
【初級】
選擇題:
1、下面屬于關鍵字的是()
~~~
A. func
B. def
C. struct
D. class
~~~
參考答案:AC
2、定義一個包內全局字符串變量,下面語法正確的是 ()
~~~
A. var str string
B. str := ""
C. str = ""
D. var str = ""
~~~
參考答案:AD
3、通過指針變量 p 訪問其成員變量 name,下面語法正確的是()
~~~
A. p.name
B. (*p).name
C. (&p).name
D. p->name
~~~
參考答案:AB
4、關于接口和類的說法,下面說法正確的是()
~~~
A. 一個類只需要實現了接口要求的所有函數,我們就說這個類實現了該接口
B. 實現類的時候,只需要關心自己應該提供哪些方法,不用再糾結接口需要拆得多細才合理
C. 類實現接口時,需要導入接口所在的包
D. 接口由使用方按自身需求來定義,使用方無需關心是否有其他模塊定義過類似的接口
~~~
參考答案:ABD
5、關于字符串連接,下面語法正確的是()
~~~
A. str := ‘abc’ + ‘123’
B. str := "abc" + "123"
C. str := '123' + "abc"
D. fmt.Sprintf("abc%d", 123)
~~~
參考答案:BD
6、關于協程,下面說法正確是()
~~~
A. 協程和線程都可以實現程序的并發執行
B. 線程比協程更輕量級
C. 協程不存在死鎖問題
D. 通過channel來進行協程間的通信
~~~
參考答案:AD
7、關于循環語句,下面說法正確的有()
~~~
A. 循環語句既支持for關鍵字,也支持while和do-while
B. 關鍵字for的基本使用方法與C/C++中沒有任何差異
C. for循環支持continue和break來控制循環,但是它提供了一個更高級的break,可以選擇中斷哪一個循環
D. for循環不支持以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變量
~~~
參考答案:CD
8、對于函數定義:
~~~
func add(args ...int) int {
sum := 0
for _, arg := range args {
sum += arg
}
return sum
}
~~~
下面對add函數調用正確的是()
~~~
A. add(1, 2)
B. add(1, 3, 7)
C. add([]int{1, 2})
D. add([]int{1, 3, 7}...)
~~~
參考答案:ABD
9、關于類型轉化,下面語法正確的是()
~~~
A.
type MyInt int
var i int = 1
var j MyInt = i
B.
type MyInt int
var i int = 1
var j MyInt = (MyInt)i
C.
type MyInt int
var i int = 1
var j MyInt = MyInt(i)
D.
type MyInt int
var i int = 1
var j MyInt = i.(MyInt)
~~~
參考答案:C
10、關于局部變量的初始化,下面正確的使用方式是()
~~~
A. var i int = 10
B. var i = 10
C. i := 10
D. i = 10
~~~
參考答案:ABC
11、關于const常量定義,下面正確的使用方式是()
~~~
A.
const Pi float64 = 3.14159265358979323846
const zero = 0.0
B.
const (
size int64 = 1024
eof = -1
)
C.
const (
ERR_ELEM_EXIST error = errors.New("element already exists")
ERR_ELEM_NT_EXIST error = errors.New("element not exists")
)
D.
const u, v float32 = 0, 3
const a, b, c = 3, 4, "foo"
~~~
參考答案:ABD
12、關于布爾變量b的賦值,下面錯誤的用法是()
~~~
A. b = true
B. b = 1
C. b = bool(1)
D. b = (1 == 2)
~~~
參考答案:BC
13、關于switch語句,下面說法正確的有()
~~~
A. 條件表達式必須為常量或者整數
B. 單個case中,可以出現多個結果選項
C. 需要用break來明確退出一個case
D. 只有在case中明確添加fallthrough關鍵字,才會繼續執行緊跟的下一個case
~~~
參考答案:BD
14、關于main函數(可執行程序的執行起點),下面說法正確的是()
~~~
A. main函數不能帶參數
B. main函數不能定義返回值
C. main函數所在的包必須為main包
D. main函數中可以使用flag包來獲取和解析命令行參數
~~~
參考答案:ABCD
15、對于局部變量整型切片x的賦值,下面定義正確的是()
~~~
A.
x := []int{
1, 2, 3,
4, 5, 6,
}
B.
x := []int{
1, 2, 3,
4, 5, 6
}
C.
x := []int{
1, 2, 3,
4, 5, 6}
D.
x := []int{1, 2, 3, 4, 5, 6,}
~~~
參考答案:ACD
16、關于變量的自增和自減操作,下面語句正確的是()
~~~
A.
i := 1
i++
B.
i := 1
j = i++
C.
i := 1
++i
D.
i := 1
i--
~~~
參考答案:AD
17、關于channel,下面語法正確的是()
~~~
A. var ch chan int
B. ch := make(chan int)
C. <- ch
D. ch <-
~~~
參考答案:ABC
18、關于同步鎖,下面說法正確的是()
~~~
A. 當一個goroutine獲得了Mutex后,其他goroutine就只能乖乖的等待,除非該goroutine釋放這個Mutex
B. RWMutex在讀鎖占用的情況下,會阻止寫,但不阻止讀
C. RWMutex在寫鎖占用情況下,會阻止任何其他goroutine(無論讀和寫)進來,整個鎖相當于由該goroutine獨占
D. Lock()操作需要保證有Unlock()或RUnlock()調用與之對應
~~~
參考答案:ABC
19、flag是bool型變量,下面if表達式符合編碼規范的是()
~~~
A. if flag == 1
B. if flag
C. if flag == false
D. if !flag
~~~
參考答案:BD
20、value是整型變量,下面if表達式符合編碼規范的是()
~~~
A. if value == 0
B. if value
C. if value != 0
D. if !value
~~~
參考答案:AC
21、關于select機制,下面說法正確的是()
~~~
A. select機制用來處理異步IO問題
B. select機制最大的一條限制就是每個case語句里必須是一個IO操作
C. golang在語言級別支持select關鍵字
D. select關鍵字的用法與switch語句非常類似,后面要帶判斷條件
~~~
參考答案:ABC
22、關于內存泄露,下面說法正確的是()
~~~
A. golang有自動垃圾回收,不存在內存泄露
B. golang中檢測內存泄露主要依靠的是pprof包
C. 內存泄露可以在編譯階段發現
D. 應定期使用瀏覽器來查看系統的實時內存信息,及時發現內存泄露問題
~~~
參考答案:BD
填空題
1、聲明一個整型變量i__________
參考答案:
~~~
var i int
~~~
2、聲明一個含有10個元素的整型數組a__________
參考答案:
~~~
var a [10]int
~~~
3、聲明一個整型數組切片s__________
參考答案:
~~~
var s []int
~~~
4、聲明一個整型指針變量p__________
參考答案:
~~~
var p *int
~~~
5、聲明一個key為字符串型value為整型的map變量m__________
參考答案:
~~~
var m map[string]int
~~~
6、聲明一個入參和返回值均為整型的函數變量f__________
參考答案:
~~~
var f func(a int) int
~~~
7、聲明一個只用于讀取int數據的單向channel變量ch__________
參考答案:
~~~
var ch <-chan int
~~~
8、假設源文件的命名為slice.go,則測試文件的命名為__________
參考答案:
~~~
slice_test.go
~~~
9、go test要求測試函數的前綴必須命名為__________
參考答案:
~~~
Test
~~~
10、下面的程序的運行結果是__________
~~~
func main() {
i := 1
j := 2
i, j = j, i
fmt.Printf("%d%d\n", i, j)
}
~~~
參考答案:
~~~
21
~~~
11、下面的程序的運行結果是__________
~~~
func incr(p *int) int {
*p++
return *p
}
func main() {
v := 1
incr(&v)
fmt.Println(v)
}
~~~
參考答案:
~~~
2
~~~
12、啟動一個goroutine的關鍵字是__________
參考答案:
~~~
go
~~~
判斷題
1、數組是一個值類型()
參考答案:T
2、使用map不需要引入任何庫()
參考答案:T
3、指針是基礎類型()
參考答案:F
4、interface{}是可以指向任意對象的Any類型()
參考答案:T
5、Golang不支持自動垃圾回收()
參考答案:F
6、Golang支持反射,反射最常見的使用場景是做對象的序列化()
參考答案:T
7、Golang可以復用C/C++的模塊,這個功能叫Cgo()
參考答案:F
8、下面代碼中兩個斜點之間的代碼,比如json:"x",作用是X字段在從結構體實例編碼到JSON數據格式的時候,使用x作為名字,這可以看作是一種重命名的方式()
~~~
type Position struct {
X int `json:"x"`
Y int `json:"y"`
Z int `json:"z"`
}
~~~
參考答案:T
9、通過成員變量或函數首字母的大小寫來決定其作用域()
參考答案:T
10、對于常量定義zero(const zero = 0.0),zero是浮點型常量()
參考答案:F
11、對變量x的取反操作是~x()
參考答案:F
12、下面的程序的運行結果是xello()
~~~
func main() {
str := "hello"
str[0] = 'x'
fmt.Println(str)
}
~~~
參考答案:F
13、golang支持goto語句()
參考答案:T
14、下面代碼中的指針p為野指針,因為返回的棧內存在函數結束時會被釋放()
~~~
type TimesMatcher struct {
base int
}
func NewTimesMatcher(base int) *TimesMatcher{
return &TimesMatcher{base:base}
}
func main() {
p := NewTimesMatcher(3)
...
}
~~~
參考答案:F
15、匿名函數可以直接賦值給一個變量或者直接執行()
參考答案:T
16、如果調用方調用了一個具有多返回值的方法,但是卻不想關心其中的某個返回值,可以簡單地用一個下劃線“_”來跳過這個返回值,該下劃線對應的變量叫匿名變量()
參考答案:T
17、在函數的多返回值中,如果有error或bool類型,則一般放在最后一個()
參考答案:T
18、錯誤是業務過程的一部分,而異常不是()
參考答案:T
19、函數執行時,如果由于panic導致了異常,則延遲函數不會執行()
參考答案:F
20、同級文件的包名不允許有多個()
參考答案:T
21、golang雖然沒有顯式的提供繼承語法,但是通過匿名組合實現了繼承()
參考答案:T
22、使用for range迭代map時每次迭代的順序可能不一樣,因為map的迭代是隨機的()
參考答案:T
23、switch后面可以不跟表達式()
參考答案:T
24、golang中沒有構造函數的概念,對象的創建通常交由一個全局的創建函數來完成,以NewXXX來命名()
參考答案:T
25、import后面的最后一個元素是包名()
參考答案:F
【中級】
選擇題
1、關于init函數,下面說法正確的是()
~~~
A. 一個包中,可以包含多個init函數
B. 程序編譯時,先執行導入包的init函數,再執行本包內的init函數
C. main包中,不能有init函數
D. init函數可以被其他函數調用
~~~
參考答案:AB
2、下面的程序的運行結果是()
~~~
func main() {
if (true) {
defer fmt.Printf("1")
} else {
defer fmt.Printf("2")
}
fmt.Printf("3")
}
~~~
~~~
A. 321
B. 32
C. 31
D. 13
~~~
參考答案:C
3、golang中沒有隱藏的this指針,這句話的含義是()
~~~
A. 方法施加的對象顯式傳遞,沒有被隱藏起來
B. golang沿襲了傳統面向對象編程中的諸多概念,比如繼承、虛函數和構造函數
C. golang的面向對象表達更直觀,對于面向過程只是換了一種語法形式來表達
D. 方法施加的對象不需要非得是指針,也不用非得叫this
~~~
參考答案:ACD
4、golang中的引用類型包括()
~~~
A. 數組切片
B. map
C. channel
D. interface
~~~
參考答案:ABCD
5、golang中的指針運算包括()
~~~
A. 可以對指針進行自增或自減運算
B. 可以通過“&”取指針的地址
C. 可以通過“*”取指針指向的數據
D. 可以對指針進行下標運算
~~~
參考答案:BC
6、下面賦值正確的是()
~~~
A. var x = nil
B. var x interface{} = nil
C. var x string = nil
D. var x error = nil
~~~
參考答案:BD
7、關于整型切片的初始化,下面正確的是()
~~~
A. s := make([]int)
B. s := make([]int, 0)
C. s := make([]int, 5, 10)
D. s := []int{1, 2, 3, 4, 5}
~~~
參考答案:BCD
8、從切片中刪除一個元素,下面的算法實現正確的是()
~~~
A.
func (s *Slice)Remove(value interface{}) error {
for i, v := range *s {
if isEqual(value, v) {
if i== len(*s) - 1 {
*s = (*s)[:i]
}else {
*s = append((*s)[:i],(*s)[i + 2:]...)
}
return nil
}
}
return ERR_ELEM_NT_EXIST
}
B.
func (s *Slice)Remove(value interface{}) error {
for i, v := range *s {
if isEqual(value, v) {
*s = append((*s)[:i],(*s)[i + 1:])
return nil
}
}
return ERR_ELEM_NT_EXIST
}
C.
func (s *Slice)Remove(value interface{}) error {
for i, v := range *s {
if isEqual(value, v) {
delete(*s, v)
return nil
}
}
return ERR_ELEM_NT_EXIST
}
D.
func (s *Slice)Remove(value interface{}) error {
for i, v := range *s {
if isEqual(value, v) {
*s = append((*s)[:i],(*s)[i + 1:]...)
return nil
}
}
return ERR_ELEM_NT_EXIST
}
~~~
參考答案:D
9、關于函數聲明,下面語法錯誤的是()
~~~
A. func f(a, b int) (value int, err error)
B. func f(a int, b int) (value int, err error)
C. func f(a, b int) (value int, error)
D. func f(a int, b int) (int, int, error)
~~~
參考答案:C
10、如果Add函數的調用代碼為:
~~~
func main() {
var a Integer = 1
var b Integer = 2
var i interface{} = &a
sum := i.(*Integer).Add(b)
fmt.Println(sum)
}
~~~
則Add函數定義正確的是()
~~~
A.
type Integer int
func (a Integer) Add(b Integer) Integer {
return a + b
}
B.
type Integer int
func (a Integer) Add(b *Integer) Integer {
return a + *b
}
C.
type Integer int
func (a *Integer) Add(b Integer) Integer {
return *a + b
}
D.
type Integer int
func (a *Integer) Add(b *Integer) Integer {
return *a + *b
}
~~~
參考答案:AC
11、如果Add函數的調用代碼為:
~~~
func main() {
var a Integer = 1
var b Integer = 2
var i interface{} = a
sum := i.(Integer).Add(b)
fmt.Println(sum)
}
~~~
則Add函數定義正確的是()
~~~
A.
type Integer int
func (a Integer) Add(b Integer) Integer {
return a + b
}
B.
type Integer int
func (a Integer) Add(b *Integer) Integer {
return a + *b
}
C.
type Integer int
func (a *Integer) Add(b Integer) Integer {
return *a + b
}
D.
type Integer int
func (a *Integer) Add(b *Integer) Integer {
return *a + *b
}
~~~
參考答案:A
12、關于GetPodAction定義,下面賦值正確的是()
~~~
type Fragment interface {
Exec(transInfo *TransInfo) error
}
type GetPodAction struct {
}
func (g GetPodAction) Exec(transInfo *TransInfo) error {
...
return nil
}
~~~
~~~
A. var fragment Fragment = new(GetPodAction)
B. var fragment Fragment = GetPodAction
C. var fragment Fragment = &GetPodAction{}
D. var fragment Fragment = GetPodAction{}
~~~
參考答案:ACD
13、關于GoMock,下面說法正確的是()
~~~
A. GoMock可以對interface打樁
B. GoMock可以對類的成員函數打樁
C. GoMock可以對函數打樁
D. GoMock打樁后的依賴注入可以通過GoStub完成
~~~
參考答案:AD
14、關于接口,下面說法正確的是()
~~~
A. 只要兩個接口擁有相同的方法列表(次序不同不要緊),那么它們就是等價的,可以相互賦值
B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以賦值給接口A
C. 接口查詢是否成功,要在運行期才能夠確定
D. 接口賦值是否可行,要在運行期才能夠確定
~~~
參考答案:ABC
15、golang中大多數數據類型都可以轉化為有效的JSON文本,下面幾種類型除外()
~~~
A. 指針
B. channel
C. complex
D. 函數
~~~
參考答案:BCD
16、關于go vendor,下面說法正確的是()
~~~
A. 基本思路是將引用的外部包的源代碼放在當前工程的vendor目錄下面
B. 編譯go代碼會優先從vendor目錄先尋找依賴包
C. 可以指定引用某個特定版本的外部包
D. 有了vendor目錄后,打包當前的工程代碼到其他機器的$GOPATH/src下都可以通過編譯
~~~
參考答案:ABD
17、關于函數返回值的錯誤設計,下面說法正確的是()
~~~
A. 如果失敗原因只有一個,則返回bool
B. 如果失敗原因超過一個,則返回error
C. 如果沒有失敗原因,則不返回bool或error
D. 如果重試幾次可以避免失敗,則不要立即返回bool或error
~~~
參考答案:ABCD
18、關于異常設計,下面說法正確的是()
~~~
A. 在程序開發階段,堅持速錯,讓程序異常崩潰
B. 在程序部署后,應恢復異常避免程序終止
C. 一切皆錯誤,不用進行異常設計
D. 對于不應該出現的分支,使用異常處理
~~~
參考答案:ABD
19、關于slice或map操作,下面正確的是()
~~~
A.
var s []int
s = append(s,1)
B.
var m map[string]int
m["one"] = 1
C.
var s []int
s = make([]int, 0)
s = append(s,1)
D.
var m map[string]int
m = make(map[string]int)
m["one"] = 1
~~~
參考答案:ACD
20、關于channel的特性,下面說法正確的是()
~~~
A. 給一個 nil channel 發送數據,造成永遠阻塞
B. 從一個 nil channel 接收數據,造成永遠阻塞
C. 給一個已經關閉的 channel 發送數據,引起 panic
D. 從一個已經關閉的 channel 接收數據,如果緩沖區中為空,則返回一個零值
~~~
參考答案:ABCD
21、關于無緩沖和有沖突的channel,下面說法正確的是()
~~~
A. 無緩沖的channel是默認的緩沖為1的channel
B. 無緩沖的channel和有緩沖的channel都是同步的
C. 無緩沖的channel和有緩沖的channel都是非同步的
D. 無緩沖的channel是同步的,而有緩沖的channel是非同步的
~~~
參考答案:D
22、關于異常的觸發,下面說法正確的是()
~~~
A. 空指針解析
B. 下標越界
C. 除數為0
D. 調用panic函數
~~~
參考答案:ABCD
23、關于cap函數的適用類型,下面說法正確的是()
~~~
A. array
B. slice
C. map
D. channel
~~~
參考答案:ABD
24、關于beego框架,下面說法正確的是()
~~~
A. beego是一個golang實現的輕量級HTTP框架
B. beego可以通過注釋路由、正則路由等多種方式完成url路由注入
C. 可以使用bee new工具生成空工程,然后使用bee run命令自動熱編譯
D. beego框架只提供了對url路由的處理, 而對于MVC架構中的數據庫部分未提供框架支持
~~~
參考答案:ABC
25、關于goconvey,下面說法正確的是()
~~~
A. goconvey是一個支持golang的單元測試框架
B. goconvey能夠自動監控文件修改并啟動測試,并可以將測試結果實時輸出到web界面
C. goconvey提供了豐富的斷言簡化測試用例的編寫
D. goconvey無法與go test集成
~~~
參考答案:ABC
26、關于go vet,下面說法正確的是()
~~~
A. go vet是golang自帶工具go tool vet的封裝
B. 當執行go vet database時,可以對database所在目錄下的所有子文件夾進行遞歸檢測
C. go vet可以使用絕對路徑、相對路徑或相對GOPATH的路徑指定待檢測的包
D. go vet可以檢測出死代碼
~~~
參考答案:ACD
27、關于map,下面說法正確的是()
~~~
A. map反序列化時json.unmarshal的入參必須為map的地址
B. 在函數調用中傳遞map,則子函數中對map元素的增加不會導致父函數中map的修改
C. 在函數調用中傳遞map,則子函數中對map元素的修改不會導致父函數中map的修改
D. 不能使用內置函數delete刪除map的元素
~~~
參考答案:A
28、關于GoStub,下面說法正確的是()
~~~
A. GoStub可以對全局變量打樁
B. GoStub可以對函數打樁
C. GoStub可以對類的成員方法打樁
D. GoStub可以打動態樁,比如對一個函數打樁后,多次調用該函數會有不同的行為
~~~
參考答案:ABD
填空題
1、下面的程序的運行結果是__________
~~~
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
~~~
參考答案:
~~~
4 3 2 1 0
~~~
2、下面的程序的運行結果是__________
~~~
func main() {
x := 1
{
x := 2
fmt.Print(x)
}
fmt.Println(x)
}
~~~
參考答案:
~~~
21
~~~
3、下面的程序的運行結果是__________
~~~
func main() {
strs := []string{"one", "two", "three"}
for _, s := range strs {
go func() {
time.Sleep(1 * time.Second)
fmt.Printf("%s ", s)
}()
}
time.Sleep(3 * time.Second)
}
~~~
參考答案:
~~~
three three three
~~~
4、下面的程序的運行結果是__________
~~~
func main() {
x := []string{"a", "b", "c"}
for v := range x {
fmt.Print(v)
}
}
~~~
參考答案:
~~~
012
~~~
5、下面的程序的運行結果是__________
~~~
func main() {
x := []string{"a", "b", "c"}
for _, v := range x {
fmt.Print(v)
}
}
~~~
參考答案:
~~~
abc
~~~
6、下面的程序的運行結果是__________
~~~
type Slice []int
func NewSlice() Slice {
return make(Slice, 0)
}
func (s* Slice) Add(elem int) *Slice {
*s = append(*s, elem)
fmt.Print(elem)
return s
}
func main() {
s := NewSlice()
defer s.Add(1).Add(2)
s.Add(3)
}
~~~
參考答案:
~~~
132
~~~
判斷題
1、內置函數delete可以刪除數組切片內的元素()
參考答案:F
2、下面關于文件操作的代碼可能觸發異常()
~~~
file, err := os.Open("test.go")
defer file.Close()
if err != nil {
fmt.Println("open file failed:", err)
return
}
...
~~~
參考答案:T
3、當程序運行時,如果遇到引用空指針、下標越界或顯式調用panic函數等情況,則先觸發panic函數的執行,然后調用延遲函數。調用者繼續傳遞panic,因此該過程一直在調用棧中重復發生:函數停止執行,調用延遲執行函數。如果一路在延遲函數中沒有recover函數的調用,則會到達該攜程的起點,該攜程結束,然后終止其他所有攜程,其他攜程的終止過程也是重復發生:函數停止執行,調用延遲執行函數()
參考答案:F
4、可以給任意類型添加相應的方法()
參考答案:F
5、結構體在序列化時非導出變量(以小寫字母開頭的變量名)不會被encode,因此在decode時這些非導出變量的值為其類型的零值()
參考答案:T
5、當函數deferDemo返回失敗時,并不能destroy已create成功的資源()
~~~
func deferDemo() error {
err := createResource1()
if err != nil {
return ERR_CREATE_RESOURCE1_FAILED
}
defer func() {
if err != nil {
destroyResource1()
}
}()
err = createResource2()
if err != nil {
return ERR_CREATE_RESOURCE2_FAILED
}
defer func() {
if err != nil {
destroyResource2()
}
}()
err = createResource3()
if err != nil {
return ERR_CREATE_RESOURCE3_FAILED
}
return nil
}
~~~
參考答案:F
6、channel本身必然是同時支持讀寫的,所以不存在單向channel()
參考答案:F
~~~
作者:_張曉龍_
鏈接:https://www.jianshu.com/p/f690203ff168
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
~~~
- 序言
- 目錄
- 環境搭建
- Linux搭建golang環境
- Windows搭建golang環境
- Mac搭建golang環境
- Go 環境變量
- 編輯器
- vs code
- Mac 安裝vs code
- Windows 安裝vs code
- vim編輯器
- 介紹
- 1.Go語言的主要特征
- 2.golang內置類型和函數
- 3.init函數和main函數
- 4.包
- 1.工作空間
- 2.源文件
- 3.包結構
- 4.文檔
- 5.編寫 Hello World
- 6.Go語言 “ _ ”(下劃線)
- 7.運算符
- 8.命令
- 類型
- 1.變量
- 2.常量
- 3.基本類型
- 1.基本類型介紹
- 2.字符串String
- 3.數組Array
- 4.類型轉換
- 4.引用類型
- 1.引用類型介紹
- 2.切片Slice
- 3.容器Map
- 4.管道Channel
- 5.指針
- 6.自定義類型Struct
- 流程控制
- 1.條件語句(if)
- 2.條件語句 (switch)
- 3.條件語句 (select)
- 4.循環語句 (for)
- 5.循環語句 (range)
- 6.循環控制Goto、Break、Continue
- 函數
- 1.函數定義
- 2.參數
- 3.返回值
- 4.匿名函數
- 5.閉包、遞歸
- 6.延遲調用 (defer)
- 7.異常處理
- 8.單元測試
- 壓力測試
- 方法
- 1.方法定義
- 2.匿名字段
- 3.方法集
- 4.表達式
- 5.自定義error
- 接口
- 1.接口定義
- 2.執行機制
- 3.接口轉換
- 4.接口技巧
- 面向對象特性
- 并發
- 1.并發介紹
- 2.Goroutine
- 3.Chan
- 4.WaitGroup
- 5.Context
- 應用
- 反射reflection
- 1.獲取基本類型
- 2.獲取結構體
- 3.Elem反射操作基本類型
- 4.反射調用結構體方法
- 5.Elem反射操作結構體
- 6.Elem反射獲取tag
- 7.應用
- json協議
- 1.結構體轉json
- 2.map轉json
- 3.int轉json
- 4.slice轉json
- 5.json反序列化為結構體
- 6.json反序列化為map
- 終端讀取
- 1.鍵盤(控制臺)輸入fmt
- 2.命令行參數os.Args
- 3.命令行參數flag
- 文件操作
- 1.文件創建
- 2.文件寫入
- 3.文件讀取
- 4.文件刪除
- 5.壓縮文件讀寫
- 6.判斷文件或文件夾是否存在
- 7.從一個文件拷貝到另一個文件
- 8.寫入內容到Excel
- 9.日志(log)文件
- server服務
- 1.服務端
- 2.客戶端
- 3.tcp獲取網頁數據
- 4.http初識-瀏覽器訪問服務器
- 5.客戶端訪問服務器
- 6.訪問延遲處理
- 7.form表單提交
- web模板
- 1.渲染終端
- 2.渲染瀏覽器
- 3.渲染存儲文件
- 4.自定義io.Writer渲染
- 5.模板語法
- 時間處理
- 1.格式化
- 2.運行時間
- 3.定時器
- 鎖機制
- 互斥鎖
- 讀寫鎖
- 性能比較
- sync.Map
- 原子操作
- 1.原子增(減)值
- 2.比較并交換
- 3.導入、導出、交換
- 加密解密
- 1.md5
- 2.base64
- 3.sha
- 4.hmac
- 常用算法
- 1.冒泡排序
- 2.選擇排序
- 3.快速排序
- 4.插入排序
- 5.睡眠排序
- 限流器
- 日志包
- 日志框架logrus
- 隨機數驗證碼
- 生成指定位數的隨機數
- 生成圖形驗證碼
- 編碼格式轉換
- UTF-8與GBK
- 解決中文亂碼
- 設計模式
- 創建型模式
- 單例模式
- singleton.go
- singleton_test.go
- 抽象工廠模式
- abstractfactory.go
- abstractfactory_test.go
- 工廠方法模式
- factorymethod.go
- factorymethod_test.go
- 原型模式
- prototype.go
- prototype_test.go
- 生成器模式
- builder.go
- builder_test.go
- 結構型模式
- 適配器模式
- adapter.go
- adapter_test.go
- 橋接模式
- bridge.go
- bridge_test.go
- 合成/組合模式
- composite.go
- composite_test.go
- 裝飾模式
- decoretor.go
- decorator_test.go
- 外觀模式
- facade.go
- facade_test.go
- 享元模式
- flyweight.go
- flyweight_test.go
- 代理模式
- proxy.go
- proxy_test.go
- 行為型模式
- 職責鏈模式
- chainofresponsibility.go
- chainofresponsibility_test.go
- 命令模式
- command.go
- command_test.go
- 解釋器模式
- interpreter.go
- interperter_test.go
- 迭代器模式
- iterator.go
- iterator_test.go
- 中介者模式
- mediator.go
- mediator_test.go
- 備忘錄模式
- memento.go
- memento_test.go
- 觀察者模式
- observer.go
- observer_test.go
- 狀態模式
- state.go
- state_test.go
- 策略模式
- strategy.go
- strategy_test.go
- 模板模式
- templatemethod.go
- templatemethod_test.go
- 訪問者模式
- visitor.go
- visitor_test.go
- 數據庫操作
- golang操作MySQL
- 1.mysql使用
- 2.insert操作
- 3.select 操作
- 4.update 操作
- 5.delete 操作
- 6.MySQL事務
- golang操作Redis
- 1.redis介紹
- 2.golang鏈接redis
- 3.String類型 Set、Get操作
- 4.String 批量操作
- 5.設置過期時間
- 6.list隊列操作
- 7.Hash表
- 8.Redis連接池
- 其它Redis包
- go-redis/redis包
- 安裝介紹
- String 操作
- List操作
- Set操作
- Hash操作
- golang操作ETCD
- 1.etcd介紹
- 2.鏈接etcd
- 3.etcd存取
- 4.etcd監聽Watch
- golang操作kafka
- 1.kafka介紹
- 2.寫入kafka
- 3.kafka消費
- golang操作ElasticSearch
- 1.ElasticSearch介紹
- 2.kibana介紹
- 3.寫入ElasticSearch
- NSQ
- 安裝
- 生產者
- 消費者
- zookeeper
- 基本操作測試
- 簡單的分布式server
- Zookeeper命令行使用
- GORM
- gorm介紹
- gorm查詢
- gorm更新
- gorm刪除
- gorm錯誤處理
- gorm事務
- sql構建
- gorm 用法介紹
- Go操作memcached
- beego框架
- 1.beego框架環境搭建
- 2.參數配置
- 1.默認參數
- 2.自定義配置
- 3.config包使用
- 3.路由設置
- 1.自動匹配
- 2.固定路由
- 3.正則路由
- 4.注解路由
- 5.namespace
- 4.多種數據格式輸出
- 1.直接輸出字符串
- 2.模板數據輸出
- 3.json格式數據輸出
- 4.xml格式數據輸出
- 5.jsonp調用
- 5.模板處理
- 1.模板語法
- 2.基本函數
- 3.模板函數
- 6.請求處理
- 1.GET請求
- 2.POST請求
- 3.文件上傳
- 7.表單驗證
- 1.表單驗證
- 2.定制錯誤信息
- 3.struct tag 驗證
- 4.XSRF過濾
- 8.靜態文件處理
- 1.layout設計
- 9.日志處理
- 1.日志處理
- 2.logs 模塊
- 10.會話控制
- 1.會話控制
- 2.session 包使用
- 11.ORM 使用
- 1.鏈接數據庫
- 2. CRUD 操作
- 3.原生 SQL 操作
- 4.構造查詢
- 5.事務處理
- 6.自動建表
- 12.beego 驗證碼
- 1.驗證碼插件
- 2.驗證碼使用
- beego admin
- 1.admin安裝
- 2.admin開發
- beego 熱升級
- beego實現https
- gin框架
- 安裝使用
- 路由設置
- 模板處理
- 文件上傳
- gin框架中文文檔
- gin錯誤總結
- 項目
- 秒殺項目
- 日志收集
- 面試題
- 面試題一
- 面試題二
- 錯題集
- Go語言陷阱和常見錯誤
- 常見語法錯誤
- 初級
- 中級
- 高級
- Go高級應用
- goim
- goim 啟動流程
- goim 工作流程
- goim 結構體
- gopush
- gopush工作流程
- gopush啟動流程
- gopush業務流程
- gopush應用
- gopush新添功能
- gopush壓力測試
- 壓測注意事項
- rpc
- HTTP RPC
- TCP RPC
- JSON RPC
- 常見RPC開源框架
- pprof
- pprof介紹
- pprof應用
- 使用pprof及Go 程序的性能優化
- 封裝 websocket
- cgo
- Golang GC
- 查看程序運行過程中的GC信息
- 定位gc問題所在
- Go語言 demo
- 用Go語言計算一個人的年齡,生肖,星座
- 超簡易Go語言實現的留言板代碼
- 信號處理模塊,可用于在線加載配置,配置動態加載的信號為SIGHUP
- 陽歷和陰歷相互轉化的工具類 golang版本
- 錯誤總結
- 網絡編程
- 網絡編程http
- 網絡編程tcp
- Http請求
- Go語言必知的90個知識點
- 第三方庫應用
- cli應用
- Cobra
- 圖表庫
- go-echarts
- 開源IM
- im_service
- 機器學習庫
- Tensorflow
- 生成二維碼
- skip2/go-qrcode生成二維碼
- boombuler/barcode生成二維碼
- tuotoo/qrcode識別二維碼
- 日志庫
- 定時任務
- robfig/cron
- jasonlvhit/gocron
- 拼多多開放平臺 SDK
- Go編譯
- 跨平臺交叉編譯
- 一問一答
- 一問一答(一)
- 為什么 Go 標準庫中有些函數只有簽名,沒有函數體?
- Go開發的應用
- etcd
- k8s
- Caddy
- nsq
- Docker
- web框架