1. for range循環周遊slice/map,值是複制的,且每次循環都是用同一個值儲存複制後的值
package
第一次循環時用v儲存了第一個student的值,然後第二次循環時依然用v儲存的第二個值,這就導緻&v一直是一樣的
2. map[int]*struct可以直接對struct元素指派,而map[int]struct不可以
type
3. 所有函數參數都是在定義函數的那一行就預先運作了參數計算,與函數實際運作順序無關
func
4. 調用對象的方法,會根據需要自動轉換為指針或者對象;調用接口的方法,必須區分是執行個體方法還是指針方法,指針可以調用執行個體方法,反之不行
// 調用對象方法
總結一下就是非指針接口不能調用指針方法,其他都可以
5. 函數不可以比較(隻能和nil比較),是以不可以做為map的key
6. map中的元素是會變動的,是以不能取位址
7. 接口指派,即便指派為nil,但不等于nil
iseprimport
8. json與golnag類型對應關系
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
9. golang字元串,每個字元是rune類型
for _, s := range strings // s is rune
strings[0] // byte alias uint8
10. 函數傳回值:命名傳回值和非命名傳回值的差別
https://play.golang.org/p/wxE5r5DQbs9play.golang.org
package main
func main() {
println(DeferFunc1(1))
println(DeferFunc2(1))
println(DeferFunc3(1))
}
func DeferFunc1(i int) (t int) {
t = i
defer func() {
t += 3
}()
return t
}
func DeferFunc2(i int) int {
t := i
defer func() {
t += 3
}()
return t
}
func DeferFunc3(i int) (t int) {
defer func() {
t += i
}()
return 2
}
// OUTPUT
4
1
3
普通傳回執行順序:
1. res = xxx
2. defer // 無法修改傳回值
3. return res
命名傳回
1. 函數在執行最開始時已經初始化了命名傳回
2. defer // 可以修改傳回值
3. return 命名傳回
11. iota用法
const (
x = iota
y
z = "zz"
k
p = iota
)
func main() {
fmt.Println(x,y,z,k,p)
}
// output
0, 1, zz, zz, 4
12. 細節注意
const 常量不可以取位址
goto 不可以跳入下一層,隻能調到和goto語句同層或者上層
break 隻會跳出目前for循環
type alias定義的變量不是新的類型,可以直接用原始類型指派,且具有原始類型的方法,和原始類型除了名字有差別,其他一樣,而type定義的是新的類型
Named Type可以與Unamed Type互相指派,隻要底層一樣
panic僅有最後一個可以被revover捕獲
13. string拼接
- 在已有字元串數組的場合,使用 strings.Join() 能有比較好的性能
- 在一些性能要求較高的場合,盡量使用 buffer.WriteString() 以獲得更好的性能
- 性能要求不太高的場合,直接使用運算符,代碼更簡短清晰,能獲得比較好的可讀性
- 如果需要拼接的不僅僅是字元串,還有數字之類的其他需求的話,可以考慮 fmt.Sprintf()
14. compare
bool int float complex string 這都是基本類型,直接比較
array 類型相等且所有值相等才相等
pointer 指向同一個value那麼相等,或者都為nil
channel 同一個make傳回的相等,或者都為nil
interface dynamic type and dynamic value都相等才相等,或者都為nil
struct 非 _ 字段都可以比較,且都相等才相等
x 實作了interface T,如果x可以比較,那麼将x轉換為interface比較Slice, map, and function values are not comparable.
pointer channel interface 初始值都是nil
使用reflect.DeepEqual對slice比較,一定要注意nil!= [],通常從db中擷取的slice和http擷取的slice空值不一樣15. interface and reflect
- 從interface到reflect對象
- 從reflect對象到interface
- 改變一個interface,但它的值必須是可被改變的