我在看這個網頁時,遇到兩個問題:https://studygolang.com/articles/22460
問題1:
看到一個函式是這樣定義的:
func (fd *FD) Read(p []byte) (int, error) {
if err := fd.readLock(); err != nil {
return 0, err
}
……
}
(p []byte) 是引數,(int, error) 是回傳值型別, (fd *FD) 是什么?
問題2:
func handleConnection(conn net.Conn) {
defer conn.Close()
var body [4]byte
addr := conn.RemoteAddr()
for {
// 讀取客戶端訊息
_, err := conn.Read(body[:])
if err != nil {
break
}
fmt.Printf("收到%s訊息: %s\n", addr, string(body[:]))
// 回包
_, err = conn.Write(body[:])
if err != nil {
break
}
fmt.Printf("發送給%s: %s\n", addr, string(body[:]))
}
fmt.Printf("與%s斷開!\n", addr)
}
_, err := conn.Read(body[:]) 陳述句中的 [:] 是什么意思?中括號里一個冒號。
uj5u.com熱心網友回復:
1: (fd *FD)是方法接收器,一般來說是個struct,當然也可能是type FD struct這樣的自定義型別,具體你找到原始碼看一下。說通俗點,你可以認為*FD實作了(接收)Read方法,注意是*FD,不是FD,(fd FD)這樣的才是FD。2:[:]表示截取body陣列所有資料類似body[0:4]
uj5u.com熱心網友回復:
2:[:]表示截取body陣列所有資料,等效于body[0:4],注意經過[:]后,截取的資料是切片了,不再是陣列。uj5u.com熱心網友回復:
1 說得不太正確,本來type FD struct就是定義結構體的語法,type FD int ,舉這樣的例子比較合適。uj5u.com熱心網友回復:
這兩個問題是基本的語法問題,認真看下語法不難理解的。1、定義一個結構體的方法,fd *FD是定義一個結構體成員,實作了某個介面的Read方法(可以認為繼承了這個介面)
2、body[:]是回傳一個slice(切片),冒號兩次是起始索引,省略不寫的是默認最小或最大邊界。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10214.html
標籤:go語言
