go基礎語法50問,來看看你的go基礎合格了嗎?

目錄

  • 1.使用值為 nil 的 slice、map會發生啥
  • 2.訪問 map 中的 key,需要注意啥
  • 3.string 類型的值可以修改嗎
  • 4.switch 中如何強制執行下一個 case 代碼塊
  • 5.你是如何關閉 HTTP 的響應體的
  • 6.你是否主動關閉過http連接,為啥要這樣做
  • 7.解析 JSON 數據時,默認將數值當做哪種類型
  • 8.如何從 panic 中恢復
  • 9.簡短聲明的變量需要注意啥
  • 10.range 迭代 map是有序的嗎
  • 11.recover的執行時機
  • 12.閉包錯誤引用同一個變量問題怎么處理
  • 13.在循環內部執行defer語句會發生啥
  • 14.說出一個避免Goroutine泄露的措施
  • 15.如何跳出for select 循環
  • 16.如何在切片中查找
  • 17.如何初始化帶嵌套結構的結構體
  • 18.切片和數組的區別
  • 19.new和make的區別
  • 20.Printf()、Sprintf()、Fprintf()函數的區別用法是什么
  • 21.說說go語言中的for循環
  • 22.Array 類型的值作為函數參數
  • 23.說說go語言中的switch語句
  • 24.說說go語言中有沒有隱藏的this指針
  • 25.go語言中的引用類型包含哪些
  • 26.說說go語言的main函數
  • 27.go語言觸發異常的場景有哪些
  • 28.說說go語言的beego框架
  • 29.說說go語言的goconvey框架
  • 30.GoStub的作用是什么
  • 31.go語言編程的好處是什么
  • 32.說說go語言的select機制
  • 33.解釋一下go語言中的靜態類型聲明
  • 34.go的接口是什么
  • 35.Go語言里面的類型斷言是怎么回事
  • 36.go語言中局部變量和全局變量的缺省值是什么
  • 37.go語言編程的好處是什么
  • 38.解釋一下go語言中的靜態類型聲明
  • 39.模塊化編程是怎么回事
  • 40.Golang的方法有什么特別之處
  • 41.Golang可變參數
  • 42.Golang Slice的底層實現
  • 43.Golang Slice的擴容機制,有什么注意點
  • 44.Golang Map底層實現
  • 45. JSON 標準庫對 nil slice 和 空 slice 的處理是一致的嗎
  • 46.Golang的內存模型,為什么小對象多了會造成gc壓力
  • 47.Data Race問題怎么解決?能不能不加鎖解決這個問題
  • 48.在 range 迭代 slice 時,你怎么修改值的
  • 49.nil interface 和 nil interface 的區別
  • 50.select可以用于什么
1.使用值為 nil 的 slice、map會發生啥允許對值為 nil 的 slice 添加元素,但對值為 nil 的 map 添加元素,則會造成運行時 panic 。
// map 錯誤示例func main() {var m map[string]intm["one"] = 1// error: panic: assignment to entry in nil map// m := make(map[string]int)// map 的正確聲明,分配了實際的內存}// slice 正確示例func main() { var s []int s = append(s, 1)}2.訪問 map 中的 key,需要注意啥當訪問 map 中不存在的 key 時,Go 則會返回元素對應數據類型的零值,比如 nil、’’ 、false 和 0,取值操作總有值返回,故不能通過取出來的值,來判斷 key 是不是在 map 中 。
檢查 key 是否存在可以用 map 直接訪問,檢查返回的第二個參數即可 。
// 錯誤的 key 檢測方式func main() { x := map[string]string{"one": "2", "two": "", "three": "3"} if v := x["two"]; v == "" {fmt.Println("key two is no entry") // 鍵 two 存不存在都會返回的空字符串 }}// 正確示例func main() { x := map[string]string{"one": "2", "two": "", "three": "3"} if _, ok := x["two"]; !ok {fmt.Println("key two is no entry") }}3.string 類型的值可以修改嗎不能,嘗試使用索引遍歷字符串,來更新字符串中的個別字符,是不允許的 。
string 類型的值是只讀的二進制 byte slice,如果真要修改字符串中的字符 , 將 string 轉為 []byte 修改后,再轉為 string 即可 。
// 修改字符串的錯誤示例func main() { x := "text" x[0] = "T"http:// error: cannot assign to x[0] fmt.Println(x)}// 修改示例func main() { x := "text" xBytes := []byte(x) xBytes[0] = 'T' // 注意此時的 T 是 rune 類型 x = string(xBytes) fmt.Println(x) // Text}4.switch 中如何強制執行下一個 case 代碼塊switch 語句中的 case 代碼塊會默認帶上 break,但可以使用 fallthrough 來強制執行下一個 case 代碼塊 。
func main() { isSpace := func(char byte) bool {switch char {case ' ': // 空格符會直接 break,返回 false // 和其他語言不一樣// fallthrough // 返回 truecase '\t':return true}return false } fmt.Println(isSpace('\t')) // true fmt.Println(isSpace(' ')) // false}5.你是如何關閉 HTTP 的響應體的直接在處理 HTTP 響應錯誤的代碼塊中,直接關閉非 nil 的響應體;手動調用 defer 來關閉響應體 。
// 正確示例func main() { resp, err := http.Get("http://www.baidu.com")// 關閉 resp.Body 的正確姿勢if resp != nil {defer resp.Body.Close() } checkError(err) defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(string(body))}

推薦閱讀