最近在學習Go語言的基礎語法,學習教程爲 A tour of go ,本文記錄了Go語言的最基礎知識,包括基礎的程序代碼結構,變量以及函數的定義,和基礎常量的定義等。golang
一段最簡單的Go語言程序示例以下:算法
package main import ( "fmt" ) func sayhellowtoOne(name string) bool { fmt.Printf("Hellow %v\n", name) return true } func main() { var name string = "dlk" ok := sayhellowtoOne(name) if ok { fmt.Println("OK") } }
觀察這段代碼咱們能夠發現,Go語言的代碼和從前我所熟悉的C++、Java有許多相似的地方,但也有一些差異,其中最明顯的應該就是Go語言的變量定義方式和其餘語言有很大的不一樣。下面以這段代碼爲引,總結記錄一下Golang語言的一些最基礎的語法知識。框架
Go語言與其餘語言相似,也是由包名的定義與引入、函數的定義、變量的定義以及控制語句等部分組成。在本段代碼中,引入了fmt包,以main包裏面的main函數做爲程序的入口函數,同時定義了一個sayhellowtoOne()
的函數。本段程序運行的結果就是簡單的調用一個打印函數,根據傳入函數的變量值的不一樣,輸出不一樣的內容。函數
Go語言與Java等語言相似,利用包結構來管理組織代碼文件。學習
Go語言與其餘語言同樣,使用package
來定義一個包,一般程序由main包做爲程序的入口。指針
示例:code
package main
與不少語言相似,Go語言一樣是利用import來引入其餘包,就好比import "fmt"
這種形勢,可是GO語言同時還支持利用一個import關鍵詞同時引入多個包,就像下面這段代碼同樣。blog
import ( "fmt" "runtime" )
如代碼所示,一個import關鍵詞後面跟一個圓括號,裏面就能夠同時引用多個包。教程
變量的定義作用域
與其餘語言不一樣,Go語言採用了先指出變量名,再指出變量類型的方式來定義變量。例如:var x,y,z int
這樣咱們就定義了三個整數類型的變量(注意在Go中聲明瞭變量而不使用的話會提示錯誤)。據官方文檔中的解視,這種定義方法比傳統方法更可讀,能夠按天然邏輯從左相右閱讀。例子中的代碼的意思就是首先聲明瞭要定義變量,而後定義了三個變量,他們的類型爲整數類型,聽說這樣理解比較天然。另外在函數的一些複雜狀況的聲明中,這樣也比較有優點,具體能夠看官方文檔 declaration-syntax 。
Notes:
i:=1
,這種方法便快速定義了一個整數變量並賦予了值。函數的定義
定義函數使用關鍵詞func,例如例子中的代碼func sayhellowtoOne(name string) bool
該段代碼簡單定義了一個sayhellowtoOne函數,而且如Go語言中所規定的那樣,名在前類型在後,從左往右讀。首先是變量名,而後圓括號裏面定義函數參數,函數參數也是使用通常變量的定義方式,而後圓括號後面定義返回值的類型(注意這裏能夠同時定義多個返回值),最好尖括號裏面是函數的主體部分。
在上一節的例子中已經知道了如何定義一個函數,可是在函數的具體編寫過程當中,還有一些特殊的值得注意的地方。
多個返回值
Go語言支持同時返回多個返回值,只須要在返回值定義的地方進行定義,而後利用return關鍵詞進行返回便可。
func swap(a,b string)(string,string){ }
預約義的返回值
Go語言能夠不使用return語句顯式的進行返回值,而是在定義返回值類型的時候,同時給出返回值的變量名(即定義了用於返回值的變量),這樣,在函數結束後,將自動的返回定義的變量的值。可是這樣作會犧牲代碼的可讀性,所以通常用在較爲簡單的函數中。
func returnAvalue() (a int) { var x, y int x = 0 y = 1 a = x + y return }
if語句是最多見的條件判斷語句,在Go中,基本上全部的控制語句的判斷部分都不須要加圓括號括上,可是後面的執行部分必需要尖括號括起來。同時,Go語言支持在if後面臨時定義變量,但必須用:=符號進行定義,不支持使用var的方式,同時該變量的做用域直到該條件判斷語句結束爲止。
例如:
if ok := sayhellowtoOne(name); ok { fmt.Println("OK") } else { fmt.Println("error") }
for循環的書寫使用方式與if...else...語句相似。舉例以下:
//實現求開根值的算法 func sqrt(x float64) float64 { var z float64 = 1 for i := 0; i < 10; i++ { z -= (z*z - x) / (z * 2) fmt.Printf("%v\n", z) } return z }
同時。利用for循環語句,咱們能夠實現相似while語句的效果
var i int = 0 for i<20 { i++ }
被defer關鍵詞標記的語句會在他所在的函數執行完return語句後開始執行
例如咱們在執行文件的讀取操做時,利用該語句來保證文件被正確關閉
func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } defer src.Close() dst, err := os.Create(dstName) if err != nil { return } defer dst.Close() return io.Copy(dst, src) }
以官方提供的這段代碼爲例,利用defer語句實現了若是文件被正確打開,那麼他將在函數整個執行完成以後被正確的關閉,而不用擔憂由於出現erro致使函數提早返回而有的文件沒法關閉的問題。有點相似JAVA裏面的try...catch...finally語句裏面的finally部分。