go語言核心36講要點概括(6 10)

2021-08-27 11:03:03 字數 2880 閱讀 1295

06 | 程式實體的那些事兒 (下)

package main

import ."fmt"

var container = string

func main()

//輸出one

println(container[1])

}

如何判斷container型別

value,ok  :=  inte***ce{}(container).(string)

它包括了用來把container變數的值轉換為空介面值的inte***ce{}(container)。 (如果container是介面型別,直接是

container.(string))

以及乙個用於判斷前者的型別是否為切片型別 string 的.(string)。

如果ok是true,那麼被判斷的值將會被自動轉換為string型別的值,並賦給變數value,否則value將被賦予nil(即「空」)。

inte***ce{}代表空介面,任何型別都是它的實現型別,任何型別的值都可以很方便地被轉換成空介面的值

一對不包裹任何東西的花括號,除了可以代表空的**塊之外,還可用於表示不包含任何內容的資料結構(或者說資料型別)。

package main

import (

"fmt"

)var container = string

func main()

// 方式1。

_, ok1 := inte***ce{}(container).(string)

_, ok2 := inte***ce{}(container).(map[int]string)

if !(ok1 || ok2)

fmt.printf("the element is %q. (container type: %t)\n",

container[1], container)

// 方式2。

elem, err := getelement(container)

if err != nil

fmt.printf("the element is %q. (container type: %t)\n",

elem, container)

}func getelement(containeri inte***ce{}) (elem string, err error)

return

}

數字與字元轉換

package main

import (

"fmt"

"strconv"

)func main()

07 | 陣列和切片陣列長度一定,切片長度會隨著元素增加而增加,但長度不會減少

go 中陣列賦值和函式傳參都是值複製的

引用型別:切片,字典,通道,函式型別等

值型別:基礎資料型別,結構體型別

判斷是值傳遞還是引用傳遞,只需要看他的型別就行了。

//len = cap = 8

s3 := int

//[3,6)

// len = 3

//cap = 8 - 3 = 5 (可以向右擴充套件的長度,因為起始索引是3 所以減3)

s4 = s3[3:6]

擴容問題

08 | container包中的那些容器

list與ring   看原始碼

09 | 字典的操作和約束

鍵不能是函式,字典,切片型別  因為鍵要支援 == 判斷

如果是inte***ce   鍵型別具體賦值是以上3中型別  會引發panic

雜湊桶裡的結構是,「鍵的雜湊值-內部結構」對的集合,這個內部結構的結構是「鍵1元素1鍵2元素2鍵3元素3」,是一塊連續的記憶體。在通過鍵的雜湊值定位找到雜湊桶和那個「鍵的雜湊值-內部結構」對之後,就開始在這個內部結構裡找有沒有這個鍵

非原子操作需要加鎖,map併發讀寫需要加鎖,map操作不是併發安全的,判斷乙個操作是否是原子的可以使用 go run race 命令做資料的競爭檢測

10 | 通道的基本操作

通道之前取值和放入值都是並行的

通道接收方可以有兩個引數,第乙個表示值,第二個是bool型別  表示通道是否關閉

接收方在通道關閉後  任然可以接收到存在於通道裡的資料,由於這個特性,關閉通道最好在傳送方關閉

Go語言核心36講23

我在上兩篇文章中,詳細地講述了go語言中的錯誤處理,並從兩個視角為你總結了錯誤型別 錯誤值的處理技巧和設計方式。在本篇,我要給你展示go語言的另外一種錯誤處理方式。不過,嚴格來說,它處理的不是錯誤,而是異常,並且是一種在我們意料之外的程式異常。這種程式異常被叫做panic,我把它翻譯為執行時恐慌。其...

Go語言核心36講筆記 程式實體那些事

1 變數有兩種宣告方式 var name string 完整變數宣告 name yan 短變數宣告2 如果內層變數使用 去定義,會產生內部變數 但不影響外部變數 如果內層的賦值用 則會直接使用外部變數操作,會對外部變數造成修改 如果內層的賦值用 的時候不能加var,加了var還是新變數。func f...

go 語言切片要點

字面量宣告 slice int make宣告 slice make string,5 長度5容量5,slice make string,5,8 長度5容量8 使用索引宣告 slice int newslice slice 1 3 newslice2 slice 1 3 4 第三個書表明容量位置 偽 ...