Effection Go

来源:http://www.cnblogs.com/zolo/archive/2016/07/31/5723669.html
-Advertisement-
Play Games

Introduction: 新語言, 新思維 Formatting Indentation: 預設tab Line Length: 無限制, 會自動換行 Parentheses: 圓括弧, 無限制, 但會自動去掉if, switch, for控制結構中的圓括弧. 使用gofmt命令自動格式源碼. C... ...


Introduction:

新語言, 新思維

Formatting

Indentation: 預設tab

Line Length: 無限制, 會自動換行

Parentheses: 圓括弧, 無限制, 但會自動去掉if, switch, for控制結構中的圓括弧.

使用gofmt命令自動格式源碼.

Commentary

多行: /**/

單行: //

使用godoc命令自動導出註釋. 文檔註釋指緊鄰API的註釋, 如果遇到空行則會中止.

Names:

package names

interface names: 一般以-er或-able結尾

MixedCaps:

即Java中的駝峰式

GO中的identifier由字線,數字,下劃線_組成, 並且開頭不能是數字. 可分3種:

* exported identifier: 大寫開頭

* package identifier: 小寫或下劃線_開頭

* blank identifier: 下劃線_

Semicolons:

GO自動在行尾插入semicolon, 如果最後token是:

* identifier

* literal

* one of break continue, fallthrough return ++ -- ) ] }

根據解析規則, 控制結構的塊開始標記{ 另起一行.

Control structures

if-else: 與傳統C語言相同

redeclaration and reassignment: 使用short declaration必須保證at least one other variable is anew. 至少一個新變數

for: 有4種形式,

* for{...}, 死迴圈

* for condition {...}, 條件迴圈

* for init; condition; post {...}, 帶初始條件後置迴圈, 其中init部分只能使用短聲明定義新變數.

* for x := range xxx{...}, range迴圈

switch: 有2種形式,

* switch {...}, 非匹配選擇

* switch expression {...}, 是匹配選擇

select: 有1種形式,

* select {}, 非匹配選擇

Type switch:

Go的類型檢測與轉換有type-assertion與type-switch. type-switch指x.(type)必須結合switch expression{}使用. 否則報錯! 另一種替換用法是relect.TypeOf()

Funtions:

Multiple return values: 多值返回

Named result parameters: 命令返回參數

註意: Go中的method都是function(receiver, params...)形式. 但反之則不是. 另外, 只有本地類型才能定義method. cannot define new methods on non-local type. 所謂local type指在相同package path.

Defer:

defer, panic(), recover()配合使用.

理解Go的function機制, 需要明白defer stack, panic error, return value.

function無論正常結束或panic結束,都保證執行defer stack中的函數.

function如果正常結束或recover恢復panic error, 則會return value. 否則拋出panic error.

function執行defer stack時, 新的panic error會覆蓋舊的panic error.

總結而言, function是Go基本的執行處理單元.

Data:

Allocation with new or make: 理解Go的new()與make()用法, 需要明白GO的數據類型知識.

* 根據功能劃分:

基本類型: bool, int/uint/unitptr, float, complex, byte/rune/string, struct, array

指針類型: slice, map, chan, func, pointer,

介面類型: interface, error

當然nil類型也可以有pointer形式, 但不是GO的idiomatic. 介面類型是一種特殊的類型, 由<type,value>複合而成. 因為當且僅當<nil, nil>才是nil, 所以nil interface不一定等於nil.

* 根據零值(zero-value)劃分:

基本類型的零值都是non-nil

指針類型與介面類型的零值都是nil. 其實說介面類型的零值是nil不大恰當,因為interface是由<type,value>組成, 如果type為基本類型,則value的零值就不會是nil了. 指針類型與介面類型也有指針形式, 這相當於C中指針的指針, 通過間接指針來訪問數據不會是個理想的做法.

所以, 你不會用new()來創建指針類型的指針, 因為其零值是nil, 創建一個指向nil的間接指針有什麼意義哦? 也不能用make()來創建基本類型的值,因為其擁有零值了.再初始化就無價值了. 至於介面類型比較奇葩, 其底層是<type,value>,且僅當<nil,nil>時才等於nil. 否則要用 x == nil || reflect.ValueOf(x).IsNil()來判斷是否為nil.

Printing:

Go中print有2種選擇, 一是builtin的print(), println()函數. 一是fmt package. 據說後者帶有緩衝, 性能更優.

Builtin:

GO中builtin函數:

append(), copy(), delete()

len(), cap(), close()

new(), make()

complex(), real(), imag()

print(), println()

panic(), recover()

import, type, const, var block:

Go中可以將多條import, type, const, var組合為block.

在const block中使用iota表示line index(從0開始)

關於var, const的沒有聲明或定義:

變數的類型向後追溯, 直到第一個類型.

常量的定義向前追溯, 直到第一個定義.

init function:

每個go package(或者說go file)可以定義零個或多個init()函數. 在import package時會被執行, 但共執行順序無保證. 註意: 每次import package都會執行init函數, 而不僅僅初次導入執行. 這與Java中的<clinit>方法不同.

Pointers vs Values:

對於類型T, T的method是receiver為T的method. *T的method是receiver為T或*T的method. 簡單地說, T的method屬於*T, 但反之不成立.

順便記憶: cannot define new methods on non-local type.

Interface and methods:

interface是method的集合. struct是data的集合.

interface類型轉換使用type-assertion與type-switch.

Import語法:

import [name] "path"

* name可以是空(預設), 點(當前), 下劃線(無), 標識符(自定義)

* path可以是絕對路徑(相對$GOPATH), 相對路徑(相對當前go file). 註意: 結合vendor機制不能使用相對路徑, 否則解析會出錯.

Embedding:

interface, struct使用組合方式實現代碼復用, 此區別與C++, Java等的繼承.

Goroutine

go-chan

註意: channel 有三種: 讀寫chan, 只讀chan, 只寫chan. 後二者一般是作為形參. 因為一個channel只能讀或寫都是沒有意義的.

使用select結合time.After()等可以實現定時阻塞.

Web server:

http.Handle()

http.ListenAndServe()


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 字元串操作大概是電腦程式中最常見的操作了,Java中表示字元串的類是String,它有哪些方法?內部是如何實現的?如何處理各種不同的編碼?不可變性意味著什麼?字元串常量到底是什麼?hashCode是如何實現的?... ...
  • lambda是一種匿名函數,python lambda可以使簡單的函數簡潔的表達,,C++的lambda使類似嵌套函數的功能得以實現 python的lambda VC++14的lambda lambda是vc++獨有的,在vc++11以後,擴展這個功能主要是為了使代碼書寫簡潔,gcc沒有這個功能 直 ...
  • 二叉查找樹,又名二叉排序樹,亦名二叉搜索樹,一種常用的樹形數據結構 ...
  • 1:為什麼會有JSP jsp全名(java server pages)中文叫做java伺服器頁面。在Servlet那一篇我們發現用Servlet可以生成動態頁面,但是我們卻在Servlet中卻寫了大量的html標簽,此外在Servlet中我們不得不將大量靜態顯示內容和動態生產內容混合在一起,使得我們 ...
  • 五、變數與賦值 Python中的變數在聲明時不需要指定其類型,它會根據你的賦值自動判斷 對於數字和字元這種值類型的賦值,變數只是對它的引用,並不能直接刪除其值(其實由於Python中的垃圾回收機制,你並不能真正刪除任何東西,由Python自動判斷它“沒有人”了才會刪除它) 六、數字 int:有符號整 ...
  • 這一節主要介紹對資料庫的訪問操作:通過管理器(manage),對對象進行檢索、修改、刪除等操作,詳細介紹瞭如何針對不同的模型自定義管理器。 查詢和管理工作 現在,我們已經有了一個功能完善的Django管理站點來管理我們的應用,是時候學習一下如何從資料庫中檢索我們所需要的數據。Django自帶一個功能 ...
  • 和安卓是一個道理,讀取json數據 PHP文件: java文件: ...
  • 系列 《使用sklearn進行集成學習——理論》 《使用sklearn進行集成學習——實踐》 目錄 1 Random Forest和Gradient Tree Boosting參數詳解2 如何調參? 2.1 調參的目標:偏差和方差的協調 2.2 參數對整體模型性能的影響 2.3 一個朴實的方案:貪心 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...