1.interface與nil的比較(具體參考)
package main
import (
"fmt"
)
type People interface {
Show()
}
type Student struct{}
func (stu *Student) Show() {
}
func live() People {
var stu *Student
return stu
}
func main() {
if live() == nil {
fmt.Println("AAAAAAA")
} else {
fmt.Println(live())
fmt.Println("BBBBBBB")
}
}
// Output: BBBBBBB
// ##在對(duì)interface實(shí)例化中interface{}中會(huì)存儲(chǔ)對(duì)應(yīng)的類型指針和值指針,So比較會(huì)返回false。
// ##打印live()后也是nil,其實(shí)過(guò)程中是做了轉(zhuǎn)化。
2.panic與defer之爭(zhēng)
package main
import (
"fmt"
)
func main() {
defer func() { fmt.Println("A") }()
defer func() { fmt.Println("B") }()
defer func() { fmt.Println("C") }()
panic("觸發(fā)異常")
defer func() { fmt.Println("D") }()
}
// Output :
// C
// B
// A
// panic: 觸發(fā)異常 ...
// ##defer是棧式執(zhí)行,out:CBA;panic之前,正常輸出,之后異常。
3.range循環(huán)對(duì)象變量地址誤區(qū)
package main
import (
"fmt"
)
func main() {
pase_student()
}
type student struct {
Name string
Age int
}
func pase_student() {
m := make(map[string]*student)
stus := []student{
{Name: "zhou", Age: 24},
{Name: "li", Age: 23},
{Name: "wang", Age: 22},
}
fmt.Println(stus)
for _, stu := range stus {
m[stu.Name] = &stu
}
fmt.Println(m)
}
// output :
// [{zhou 24} {li 23} {wang 22}]
// map[zhou:0xc42000a0e0 li:0xc42000a0e0 wang:0xc42000a0e0]
// ##打印過(guò)程可以看出m中鍵的值地址一樣,因?yàn)閟tu是一個(gè)變量,三次都把一個(gè)變量的地址賦值給對(duì)應(yīng)鍵。
4.slice的初始化和append的語(yǔ)法
package main
import(
"fmt"
)
func main() {
s := make([]int, 3)
fmt.Println(s)
s = append(s, 1, 2, 3)
fmt.Println(s)
}
// Output:
// [0 0 0]
// [0 0 0 1 2 3]
// ##首先slice初始化會(huì)為0(非基本類型為nil),append顧名思義是追加的意思。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。