隨筆(一些需要注意的小細(xì)節(jié))

隨筆(一些需要注意的小細(xì)節(jié))

int類型是一個特殊的類型,在64位電腦上占8個字節(jié),在32位電腦上占4個字節(jié)

基本數(shù)據(jù)類型

布爾類型

  1. 布爾類型數(shù)據(jù)與整型數(shù)據(jù)不能進(jìn)行交換
  2. 聲明的布爾類型默認(rèn)為<font color=red>false</font>

浮點型

  1. 浮點數(shù)字面量被自動類型推斷為<font color=red>float64</font>類型
  2. 兩個浮點數(shù)之間不應(yīng)該使用==或!=進(jìn)行比較操作,應(yīng)該使用math標(biāo)準(zhǔn)庫

復(fù)數(shù)類型

  1. 復(fù)數(shù)類型有兩種:complex64和complex128,復(fù)數(shù)在計算機(jī)中由兩個浮點數(shù)表示,一個實部一個虛部
    1. complex64:兩個float32組成
    2. complex128:兩個float64構(gòu)成
  2. 三個內(nèi)置函數(shù):
    1. complex():構(gòu)造一個復(fù)數(shù)
    2. real():返回一個復(fù)數(shù)實部
    3. image():返回復(fù)數(shù)虛部

字符串

  1. 字符串是常量,可以直接通過索引訪問其字節(jié)單位,但是不能修改
  2. 字符串尾部<font color=red>不包含NULL字符</font>
  3. 基于字符串創(chuàng)建的切片和原字符串指向相同的底層字符數(shù)組,一樣不能修改,對字符串的切片操作返回的子串仍是string,而非slice


    go語言隨筆picture1.png

rune類型

  1. Go內(nèi)置兩種字符類型:
    1. 一種是byte的字節(jié)類類型(byte是uint的別名)
    2. 一種是Unicode編碼的字符rune(rune是int32的別名,占用四個字節(jié))
  2. Go語言默認(rèn)的字符編碼就是UTF-8類型的,如果需要特殊的編碼轉(zhuǎn)換,則使用Unicode/UTF-8標(biāo)準(zhǔn)包

指針

  1. Go語言支持多級指針**T
  2. Go不支持指針運算
  3. 函數(shù)中允許返回局部變量的地址
    • Go編譯器使用<font color=red>棧逃逸</font>機(jī)制將這種局部變量的空間分配在堆上
      func sum(a,b int) *int{
          sum := a + b
          return &sum //sum將分配在堆上
      }
      

切片

go語言隨筆picture2.png
  • 切片支持的操作

    • 內(nèi)置函數(shù)len()返回切片長度
    • 內(nèi)置函數(shù)cap()返回切片底層數(shù)組容量
    • 內(nèi)置函數(shù)append()對切片追加元素
    • 內(nèi)置函數(shù)copy()用于復(fù)制一個切片
  • 切片:

    為什么用切片:

      1. 數(shù)組的容量固定,不能自動拓展。
    
      2. 值傳遞。 數(shù)組作為函數(shù)參數(shù)時,將整個數(shù)組值拷貝一份給形參。
    
      在Go語言當(dāng),我們幾乎可以在所有的場景中,使用 切片替換數(shù)組使用。
    

    切片的本質(zhì):

      不是一個數(shù)組的指針,是一種數(shù)據(jù)結(jié)構(gòu)體,用來操作數(shù)組內(nèi)部元素。  runtime/slice.go    type slice struct {     
                                              *p 
                                              len
    

    切片的使用: cap
    }
    數(shù)組和切片定義區(qū)別:

          創(chuàng)建數(shù)組時 [ ] 指定數(shù)組長度。
    
          創(chuàng)建切片時, [] 為空,或者 ... 
    
      切片名稱 [ low : high : max ]
    
      low: 起始下標(biāo)位置
    
      high:結(jié)束下標(biāo)位置 len = high - low
    
      容量:cap = max - low
    
      截取數(shù)組,初始化 切片時,沒有指定切片容量時, 切片容量跟隨原數(shù)組(切片)。
    
          s[:high:max] : 從 0 開始,到 high結(jié)束。(不包含)
    
          s[low:] :   從low 開始,到 末尾
    
          s[: high]:  從 0 開始,到 high結(jié)束。容量跟隨原先容量?!境S谩?

    切片創(chuàng)建:

      1. 自動推導(dǎo)類型創(chuàng)建 切片。slice := []int {1, 2, 4, 6}
    
      2. slice := make([]int, 長度,容量)
    
      3. slice := make([]int, 長度)     創(chuàng)建切片時,沒有指定容量, 容量== 長度?!境S谩? 
    

    切片做函數(shù)參數(shù) —— 傳引用。(傳地址)

    append:在切片末尾追加元素

      append(切片對象, 待追加元素)
    
      向切片增加元素時,切片的容量會自動增長。1024 以下時,一兩倍方式增長。
    

    copy:

      copy(目標(biāo)位置切片, 源切片)
    
      拷貝過程中,直接對應(yīng)位置拷貝。
    
  • map:

    字典、映射 key —— value key: 唯一、無序。 不能是引用類型數(shù)據(jù)。

          map 不能使用 cap()
    

    創(chuàng)建方式:
    1. var m1 map[int]string --- 不能存儲數(shù)據(jù)

      2. m2 := map[int]string{}       ---能存儲數(shù)據(jù)
    
      3. m3 := make(map[int]string)       ---默認(rèn)len = 0
    
      4. m4 := make(map[int]string, 10)
    

    初始化:

      1. var m map[int]string = map[int]string{ 1: "aaa", 2:"bbb"}    保證key彼此不重復(fù)。
    
      2. m := map[int]string{ 1: "aaa", 2:"bbb"}
    

    賦值:

      賦值過程中,如果新map元素的key與原map元素key 相同     ——> 覆蓋(替換)
    
      賦值過程中,如果新map元素的key與原map元素key 不同 ——> 添加
    

    map的使用:

      遍歷map:
    
          for  key值, value值 := range map {
    
          } 
    
          for  key值 := range map {
    
          }   
    
      判斷map中key是否存在。
    
           map[下標(biāo)] 運算:返回兩個值, 第一個表 value 的值,如果value不存在。 nil
                  
                      第二個表 key是否存在的bool類型。存在 true, 不存在false
    

    刪除map:

      delete()函數(shù):     參1: 待刪除元素的map   參2: key值
    
      delete(map, key)    刪除一個不存在的key , 不會報錯。
    
      map 做函數(shù)參數(shù)和返回值,傳引用。
    

Switch

  • 在switch中加入了一個<font color=red>fallthough</font>關(guān)鍵字,強制執(zhí)行下一個case語句,不在判斷下一個case子句的條件是否成立
  • switch后面可以加入一個初始化語句,用分號隔開
    switch i := "y"; i{
        case "y": ···
    }
    

函數(shù)

  1. 首字母大小寫決定該函數(shù)在其他包是否可見:大寫時其他包可見,小寫時只有相同包可以訪問
  2. 不支持默認(rèn)值參數(shù)
  3. 不支持函數(shù)重載
  4. 不支持函數(shù)嵌套(除匿名函數(shù)外)

延遲調(diào)用函數(shù)---defer

  1. defer后面必須是函數(shù)或方法的調(diào)用
  2. defer函數(shù)的實參在注冊時通過值拷貝傳遞進(jìn)去
  3. defer函數(shù)的調(diào)用<font color=red>先進(jìn)后出</font>

panic和recover

  1. panic用來主動拋出錯誤,recover用來捕獲panic拋出的錯誤
    panic(i interface{})
    recover() interface{}
  1. panic的參數(shù)是一個空接口類型interface{},所以任意類型的變量都可以傳遞給panic
  2. 發(fā)生panic后,程序就會從調(diào)用panic的函數(shù)位置或者發(fā)生panic的地方立即返回,逐層向上執(zhí)行函數(shù)的defer語句,然后逐層打印函數(shù)調(diào)用堆棧,直到recover捕獲或運行到最外層函數(shù)而退出
  3. recover()用來捕獲panic,阻止panic繼續(xù)向上傳遞。
  4. recover和defer一起使用,但是recover只有在defer后面的函數(shù)體內(nèi)才能被直接調(diào)用才能捕獲panic終止異常,否則返回nil,異常繼續(xù)向外傳遞
    //這個會捕獲失敗
    defer recover()
    //這個才能調(diào)用成功
    defer func(){
        recover()
    }
  1. 包中init函數(shù)引發(fā)的panic只能在init函數(shù)中捕獲,在main函數(shù)中無法被捕獲,原因是init函數(shù)先于main函數(shù)執(zhí)行
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容