僅為個人閱讀時遇到的困惑的理解,希望友善討論
創新互聯提供成都網站制作、做網站、網頁設計,成都品牌網站建設,廣告投放等致力于企業網站建設與公司網站制作,十余年的網站開發和建站經驗,助力企業信息化建設,成功案例突破1000+,是您實現網站建設的好選擇.
2021.6.25
《GO語言圣經》-《GO程序設計語言》
P5
在命令行中運行
go run main.go 一 二三 四
得到的結果
在命令行中運行
go run main.go 一 二三 四
得到的結果
range 獲取一個范圍,
有兩個返回值,在本例中分別是 i 和 arg 。
第一個返回值 i 總是從0開始的,和 range 取范圍的值(也就是本例中的 os.Args )無關。(也就是本例中 os.Args[1:] 雖然是從 os.Args 的1值開始取的,但是在 range 中還是0)。
第二個返回值 arg 是切片的結果。
我理解的: range 將 os.Args 切成一個數組,先返回數組下標,再返回數組內容。
三次握手:
1. 主動發起連接請求端(客戶端),發送 SYN 標志位,攜帶數據包、包號
2. 被動接收連接請求端(服務器),接收 SYN,回復 ACK,攜帶應答序列號。同時,發送SYN標志位,攜帶數據包、包號
3. 主動發起連接請求端(客戶端),接收SYN 標志位,回復 ACK。
被動端(服務器)接收 ACK —— 標志著 三次握手建立完成( Accept()/Dial() 返回 )
四次揮手:
1. 主動請求斷開連接端(客戶端), 發送 FIN標志,攜帶數據包
2. 被動接受斷開連接端(服務器), 發送 ACK標志,攜帶應答序列號。 —— 半關閉完成。
3. 被動接受斷開連接端(服務器), 發送 FIN標志,攜帶數據包
4. 主動請求斷開連接端(客戶端), 發送 最后一個 ACK標志,攜帶應答序列號。—— 發送完成,客戶端不會直接退出,等 2MSL時長。
等 2MSL待目的:確保服務器 收到最后一個ACK
滑動窗口:
通知對端本地存儲數據的 緩沖區容量。—— write 函數在對端 緩沖區滿時,有可能阻塞。
TCP狀態轉換:
1. 主動發起連接請求端:
CLOSED —— 發送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回發 ACK —— ESTABLISHED (數據通信)
2. 主動關閉連接請求端:
ESTABLISHED —— 發送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半關閉、主動端)
—— 接收FIN、回復ACK —— TIME_WAIT (主動端) —— 等 2MSL 時長 —— CLOSED
3. 被動建立連接請求端:
CLOSED —— LISTEN —— 接收SYN、發送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (數據通信)
4. 被動斷開連接請求端:
ESTABLISHED —— 接收 FIN、發送 ACK —— CLOSE_WAIT —— 發送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP狀態轉換:
netstat -an | findstr? 端口號
Linux下查看TCP狀態轉換:
netstat -an | grep? 端口號
TCP和UDP對比:?
TCP: 面向連接的可靠的數據包傳遞。 針對不穩定的 網絡層,完全彌補。ACK
UDP:無連接不可靠的報文傳輸。 針對不穩定的 網絡層,完全不彌補。還原網絡真實狀態。
優點???????????????????????????????????????????????????????????? 缺點
TCP: 可靠、順序、穩定 ???????????????????????????????????? 系統資源消耗大,程序實現繁復、速度慢
UDP:系統資源消耗小,程序實現簡單、速度快 ???????????????????????? 不可靠、無序、不穩定
使用場景:
TCP:大文件、可靠數據傳輸。 對數據的 穩定性、準確性、一致性要求較高的場合。
UDP:應用于對數據時效性要求較高的場合。 網絡直播、電話會議、視頻直播、網絡游戲。
UDP-CS-Server實現流程:
1.? 創建 udp地址結構 ResolveUDPAddr(“協議”, “IP:port”) —— udpAddr 本質 struct{IP、port}
2.? 創建用于 數據通信的 socket ListenUDP(“協議”, udpAddr ) —— udpConn (socket)
3.? 從客戶端讀取數據,獲取對端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err
4.? 發送數據包給 客戶端 udpConn.WriteToUDP("數據", clientAddr)
UDP-CS-Client實現流程:
1.? 創建用于通信的 socket。 net.Dial("udp", "服務器IP:port") —— udpConn (socket)
2.? 以后流程參見 TCP客戶端實現源碼。
UDPserver默認就支持并發!
------------------------------------
命令行參數: 在main函數啟動時,向整個程序傳參。 【重點】
語法: go run xxx.go ? argv1 argv2? argv3? argv4 。。。
xxx.exe:? 第 0 個參數。
argv1 :第 1 個參數。
argv2 :第 2 個參數。
argv3 :第 3 個參數。
argv4 :第 4 個參數。
使用: list := os.Args? 提取所有命令行參數。
獲取文件屬性函數:
os.stat(文件訪問絕對路徑) —— fileInfo 接口
fileInfo 包含 兩個接口。
Name() 獲取文件名。 不帶訪問路徑
Size() 獲取文件大小。
網絡文件傳輸 —— 發送端(客戶端)
1.? 獲取命令行參數,得到文件名(帶路徑)filePath list := os.Args
2.? 使用 os.stat() 獲取 文件名(不帶路徑)fileName
3.? 創建 用于數據傳輸的 socket? net.Dial("tcp", “服務器IP+port”) —— conn
4.? 發送文件名(不帶路徑)? 給接收端, conn.write()
5.? 讀取 接收端回發“ok”,判斷無誤。封裝函數 sendFile(filePath, conn) 發送文件內容
6.? 實現 sendFile(filePath,? conn)
1) 只讀打開文件 os.Open(filePath)
for {
2) 從文件中讀數據? f.Read(buf)
3) 將讀到的數據寫到socket中? conn.write(buf[:n])
4)判斷讀取文件的 結尾。 io.EOF. 跳出循環
}
網絡文件傳輸 —— 接收端(服務器)
1. 創建用于監聽的 socket net.Listen() —— listener
2. 借助listener 創建用于 通信的 socket listener.Accpet()? —— conn
3. 讀取 conn.read() 發送端的 文件名, 保存至本地。
4. 回發 “ok”應答 發送端。
5. 封裝函數,接收文件內容 recvFile(文件路徑)
1) f = os.Create(帶有路徑的文件名)
for {
2)從 socket中讀取發送端發送的 文件內容 。 conn.read(buf)
3)? 將讀到的數據 保存至本地文件 f.Write(buf[:n])
4)? 判斷 讀取conn 結束, 代表文件傳輸完成。 n == 0? break
}
僅為個人閱讀時遇到的困惑的理解
2021.6.16
《GO語言圣經》-《GO程序設計語言》
P3
在命令行中運行 go run main.go 123
會輸出 123
在命令行中分別輸入(注意空格)
(1) go run main.go 123
和
(2) go run main.go 1 2 3
(1)中輸出結果
第一行是go命令的位置
第二行是for循環內的“一個參數”的結果
第三行是for循環外的最終結果
(2)中輸出結果
第二行是for循環內“第一個參數”的結果
第三行是for循環內“第一個和第二個參數”的結果
以此類推。
(3)如果空格大于一個,仍會以一個空格輸出
這時我才理解到書中所講述的:
也就是以空格分隔代表新的一個參數。
本文介紹一些Go語言的基礎語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執行結果:
下面來進一步介紹go的基礎語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執行結果:
更多格式化方法可以訪問中的fmt包。
log包實現了簡單的日志服務,也提供了一些格式化輸出的方法。
執行結果:
下面來介紹一下go的數據類型
下表列出了go語言的數據類型:
int、float、bool、string、數組和struct屬于值類型,這些類型的變量直接指向存在內存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執行結果:
執行結果:
Go 語言的運算符主要包括算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關運算符。
算術運算符:
關系運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執行結果:
下面介紹幾種循環語句:
執行結果:
執行結果:
也可以通過標記退出循環:
--THE END--
網頁題目:go語言圣經練習答案 go語言圣經中文版
網頁URL:http://vcdvsql.cn/article14/doodgge.html
成都網站建設公司_創新互聯,為您提供、動態網站、小程序開發、定制開發、自適應網站、網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯