05.02
net
- ResolveIAddr(new, addr string)
這個函數(shù)用來獲取一個TcpAddr對象,類似create socket的作用吧洲尊。 - ListenTCP(network string, laddr *TCPAddr)
監(jiān)聽端口,這個和C++的listen一樣 - Accept()
用來接收一個連接颜武, - DialTcp(network string, laddr, raddr *TCPAddr)
用來調(diào)用遠(yuǎn)程連接,laddr是本機(jī)地址,一般設(shè)為nil举庶,raddr是遠(yuǎn)端地址。 - Write()揩抡、Read()
用來從一個連接中寫入和讀取數(shù)據(jù)
整個流程和C++的差不多户侥,是因為連接的流程都一樣吧镀琉,所以函數(shù)的封裝也都差不多。
斷言
斷言可以判斷變量的類型蕊唐,一般有兩種使用方法屋摔。
- if判斷
if inst, ok:=a.(Type); ok{
inst.MethodA()
}
- switch
switch inst := a.(type) {
case TypeA:
inst.MethodA()
case TypeB:
inst.MethodB()
default:
fmt.Println("unknow type")
}
定時timer
golang自帶的time庫中有三種定時函數(shù)
- AfterFunc
time.AfterFunc(5 * time.Minute, func() {
fmt.Printf("expired")
}
- After
<-time.After(5 * time.Minute)
fmt.Printf("expired")
- NewTimer
timer := time.NewTimer(5 * time.Minute)
<-timer.C
fmt.Printf("expired")
如果想實現(xiàn)定時函數(shù),可以在After外層套一個for死循環(huán)替梨,這樣每隔對應(yīng)的時間凡壤,就會執(zhí)行一次指定的函數(shù)。但是如果在框架中耙替,想動態(tài)的注冊一些函數(shù),可以使用channel曹体,在死循環(huán)中select這個channle俗扇,如果收到了就執(zhí)行對應(yīng)收到的函數(shù);在注冊時候箕别,需要把時間和函數(shù)傳進(jìn)一個函數(shù)铜幽,這個函數(shù)調(diào)用timer的After函數(shù),來進(jìn)行第一次定時串稀,之后再將自己傳進(jìn)channel除抛。
flag
flag可以用來解析命令行傳進(jìn)的參數(shù),使用方法為flag.type(name, defaultValue, usage)
- type是對應(yīng)的類型名稱母截,如Bool到忽,Int,String清寇,F(xiàn)loat等
- name代表命令行參數(shù)中的鍵值喘漏,比如name是"b",那么命令行參數(shù)中-b后面的值就會被flag捕捉到
- defaultValue在沒有傳入該值得時候使用
- usage是在用戶輸入失敗的時候华烟,顯示的提示信息
另外flag還有另外一個函數(shù)翩迈,flag.TypeVar(&flagvar, name, defValue, usage),用來將參數(shù)與一個變量綁定
func main() {
name := flag.String("name", "ybh", "your name")
age := flag.Int("age", 22, "you should input a integer")
var isMale bool
flag.BoolVar(&isMale, "male", true, "if you are male, input true")
flag.Parse()
fmt.Printf("name:%v|age:%v|isMale:%v\n", *name, *age, isMale)
}
如果輸入的參數(shù)有問題盔夜,會直接報錯负饲,輸出你定義的usage信息。
需要注意的是喂链,使用flag.Type方法返回的是指針返十。如果沒有調(diào)用flag.Parse,那么所有的變量都會是默認(rèn)值而不是nil椭微。