## 一、在go語言中,new和make的區別?
new 的作用是初始化一個指向類型的指針(\*T)
new函數是內建函數,函數定義:func new(Type) \*Type
使用new函數來分配空間。傳遞給`new`函數的是一個**類型**,不是一個值。返回值是 指向這個新分配的零值的**指針**。
make 的作用是為 slice,map 或 chan 初始化并返回引用(T)。
make函數是內建函數,函數定義:func make(Type, size IntegerType) Type
· 第一個參數是一個類型,第二個參數是長度
· 返回值是一個類型
`make(T, args)`函數的目的與`new(T)`不同。它僅僅用于創建 Slice, Map 和 Channel,并且返回類型是 T(不是T\*)的一個初始化的(不是零值)的實例。
## 二、在go語言中,Printf()、Sprintf()、Fprintf()函數的區別用法是什么?
都是把格式好的字符串輸出,只是輸出的目標不一樣:
Printf(),是把格式字符串輸出到標準輸出(一般是屏幕,可以重定向)。
Printf() 是和標準輸出文件(stdout)關聯的,Fprintf 則沒有這個限制.
Sprintf(),是把格式字符串輸出到指定字符串中,所以參數比printf多一個char\*。那就是目標字符串地址。
Fprintf(), 是把格式字符串輸出到指定文件設備中,所以參數筆printf多一個文件指針FILE\*。主要用于文件操作。Fprintf()是格式化輸出到一個stream,通常是到文件。
## 三、說說go語言中,數組與切片的區別?
(1). 數組 數組是具有固定長度且擁有零個或者多個相同數據類型元素的序列。 數組的長度是數組類型的一部分,所以\[3\]int 和 \[4\]int 是兩種不同的數組類型。
數組需要指定大小,不指定也會根據初始化的自動推算出大小,不可改變 ;
數組是值傳遞;
數組是內置(build-in)類型,是一組同類型數據的集合,它是值類型,通過從0開始的下標索引訪問元素值。在初始化后長度是固定的,無法修改其長度。當作為方法的參數傳入時將復制一份數組而不是引用同一指針。數組的長度也是其類型的一部分,通過內置函數len(array)獲取其長度。
數組定義:
~~~
var array [10]intvar array = [5]int{1,2,3,4,5}
~~~
(2). 切片 切片表示一個擁有相同類型元素的可變長度的序列。 切片是一種輕量級的數據結構,它有三個屬性:指針、長度和容量。
切片不需要指定大小;
切片是地址傳遞;
切片可以通過數組來初始化,也可以通過內置函數make()初始化 .初始化時len=cap,在追加元素時如果容量cap不足時將按len的2倍擴容;
切片定義:
~~~
var slice []type = make([]type, len)
~~~
## 四、解釋以下命令的作用?
go env: #用于查看go的環境變量
go run: #用于編譯并運行go源碼文件
go build: #用于編譯源碼文件、代碼包、依賴包
go get: #用于動態獲取遠程代碼包
go install: #用于編譯go文件,并將編譯結構安裝到bin、pkg目錄
go clean: #用于清理工作目錄,刪除編譯和安裝遺留的目標文件
go version: #用于查看go的版本信息
## 五、說說go語言中的協程?
協程和線程都可以實現程序的并發執行;
通過channel來進行協程間的通信;
只需要在函數調用前添加go關鍵字即可實現go的協程,創建并發任務;
關鍵字go并非執行并發任務,而是創建一個并發任務單元;
## 六、說說go語言中的for循環?
for循環支持continue和break來控制循環,但是它提供了一個更高級的break,可以選擇中斷哪一個循環 for循環不支持以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變量
## 七、說說go語言中的switch語句?
單個case中,可以出現多個結果選項
只有在case中明確添加fallthrough關鍵字,才會繼續執行緊跟的下一個case
## 八、 go語言中沒有隱藏的this指針,這句話是什么意思?
方法施加的對象顯式傳遞,沒有被隱藏起來
golang的面向對象表達更直觀,對于面向過程只是換了一種語法形式來表達
方法施加的對象不需要非得是指針,也不用非得叫this
## 九、go語言中的引用類型包含哪些?
數組切片、字典(map)、通道(channel)、接口(interface)
## 十、 go語言中指針運算有哪些?
可以通過“&”取指針的地址
可以通過“\*”取指針指向的數據
## 十一、說說go語言的main函數
main函數不能帶參數
main函數不能定義返回值
main函數所在的包必須為main包
main函數中可以使用flag包來獲取和解析命令行參數
## 十二、說說go語言的同步鎖?
(1) 當一個goroutine獲得了Mutex后,其他goroutine就只能乖乖的等待,除非該goroutine釋放這個Mutex
(2) RWMutex在讀鎖占用的情況下,會阻止寫,但不阻止讀
(3) RWMutex在寫鎖占用情況下,會阻止任何其他goroutine(無論讀和寫)進來,整個鎖相當于由該goroutine獨占
## 十三、說說go語言的channel特性?
A. 給一個 nil channel 發送數據,造成永遠阻塞
B. 從一個 nil channel 接收數據,造成永遠阻塞
C. 給一個已經關閉的 channel 發送數據,引起 panic
D. 從一個已經關閉的 channel 接收數據,如果緩沖區中為空,則返回一個零值
E. 無緩沖的channel是同步的,而有緩沖的channel是非同步的
## 十四、go語言觸發異常的場景有哪些?
A. 空指針解析
B. 下標越界
C. 除數為0
D. 調用panic函數
## 十五、說說go語言的beego框架?
A. beego是一個golang實現的輕量級HTTP框架
B. beego可以通過注釋路由、正則路由等多種方式完成url路由注入
C. 可以使用bee new工具生成空工程,然后使用bee run命令自動熱編譯
## 十六、說說go語言的goconvey框架?
A. goconvey是一個支持golang的單元測試框架
B. goconvey能夠自動監控文件修改并啟動測試,并可以將測試結果實時輸出到web界面
C. goconvey提供了豐富的斷言簡化測試用例的編寫
## 十七、go語言中,GoStub的作用是什么?
A. GoStub可以對全局變量打樁
B. GoStub可以對函數打樁
C. GoStub不可以對類的成員方法打樁
D. GoStub可以打動態樁,比如對一個函數打樁后,多次調用該函數會有不同的行為
## 十八、說說go語言的select機制?
A. select機制用來處理異步IO問題
B. select機制最大的一條限制就是每個case語句里必須是一個IO操作
C. golang在語言級別支持select關鍵字
## 十九、說說進程、線程、協程之間的區別?
進程是資源的分配和調度的一個獨立單元,而線程是CPU調度的基本單元;
同一個進程中可以包括多個線程;
進程結束后它擁有的所有線程都將銷毀,而線程的結束不會影響同個進程中的其他線程的結束;
線程共享整個進程的資源(寄存器、堆棧、上下文),一個進程至少包括一個線程;
進程的創建調用fork或者vfork,而線程的創建調用pthread\_create;
線程中執行時一般都要進行同步和互斥,因為他們共享同一進程的所有資源;
進程是資源分配的單位
線程是操作系統調度的單位
進程切換需要的資源很最大,效率很低 線程切換需要的資源一般,效率一般 協程切換任務資源很小,效率高 多進程、多線程根據cpu核數不一樣可能是并行的 也可能是并發的。協程的本質就是使用當前進程在不同的函數代碼中切換執行,可以理解為并行。 協程是一個用戶層面的概念,不同協程的模型實現可能是單線程,也可能是多線程。
進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。(全局變量保存在堆中,局部變量及函數保存在棧中)
線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度(標準線程是這樣的)。
協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼里顯示調度。
一個應用程序一般對應一個進程,一個進程一般有一個主線程,還有若干個輔助線程,線程之間是平行運行的,在線程里面可以開啟協程,讓程序在特定的時間內運行。
協程和線程的區別是:協程避免了無意義的調度,由此可以提高性能,但也因此,程序員必須自己承擔調度的責任,同時,協程也失去了標準線程使用多CPU的能力。
[推薦文章](http://www.jishuchi.com/read/go-interview/3435)
- 一、經典(一)
- 二、經典(二)
- 三、經典(三)
- 四、經典(四)
- 五、經典(五)
- 六、經典(六)
- 七、經典(七)
- 八、經典(八)
- 九、經典(九)
- 十、經典(十)
- 十一、經典(十一)
- 十二、經典(十二)
- 其他
- 1、知識點一
- 2、面試集
- 3、負載均衡原理
- 4、LVS相關了解
- 5、微服務架構
- 6、分布式鎖實現原理
- 7、Etcd怎么實現分布式鎖
- 8、Redis的數據結構有哪些,以及實現場景
- 9、Mysql高可用方案有哪些
- 10、Go語言的棧空間管理是怎么樣的
- 11、Goroutine和Channel的作用分別是什么
- 12、Go中的鎖有哪些?三種鎖,讀寫鎖,互斥鎖,還有map的安全的鎖?
- 13、怎么限制Goroutine的數量
- 14、Goroutine和線程的區別?
- 15、中間件原理