go學習第一課–語法基礎
一.hello world
新建文件helloworld.go
package main import "fmt" func main() { fmt.Println( "Hello world!" ) }
運行代碼
go run helloworld.go
Hello world!
代碼說明
1.每個Go文件都是以package 「包名」 開頭,
package main 這行表示文件中的所有其餘代碼都屬於main 包
2.import “fmt” 語句 導入需要的包
3.func main() main函數比較特殊,當程序運行時首先運行它。
4. fmt.Println(“Hello world!”)
從fmt包調用Println函數實現在終端打印Hello world!
附錄: 網頁練習go語言
打開網站://go.dev/play/
輸入代碼可直接執行
轉載請在文章開頭附上原文鏈接地址://www.cnblogs.com/Sunzz/p/15956313.html
二 函數
1.函數調用
要調用函數,需要輸入函數名(本例中為Println),以及一對圓括號
fmt.Println()
2.函數參數
與其他函數一樣,Println可以接受一個或者多個參數,參數鞋子函數名後面的原括號中
fmt.Println( "First argument" , "Second argument" )
輸出
First argument Second argument
3.Println函數
當我們想要查看程序在做什麼的時候可以使用Println函數。傳遞給它的任何參數都將會在終端打印出來,每個參數用空格分隔。
打印完所有參數後,Println將跳動新的終端行,這就是為什麼”ln”在它名字的末尾。
package main import "fmt" func main() { fmt.Println( "First argument" , "Second argument" , "Third argument" ) fmt.Println( "Another line" ) }
輸出如下
First argument Second argument Third argument Another line
三、使用其它包中的函數
我們第一個helloworld.go程序中的代碼時main包的一部分,但是Println函數在fmt包,為了能夠調用Println,我們必須首先到人包含它的包
import “fmt”
導入包後,我們可以通過包名、點和我們想要的函數名來訪問它提供的任何函數。
fmt.Println()
1.示例
package main import ( // import語句的這種替代格式運行一次導入多個包 "math" //導入math包,這樣就可以使用maht.Floor函數來 "strings" ) func main() { math.Floor(2.75) // 調用math包中的Floor函數 strings.Title( "Hello world!" ) //調用strings中的Title函數 }
運行代碼
go run example1. go
你會發現沒有任何輸出,不用擔心,也不要着急
2.函數返回值
調用fmt.Println函數之後,我們不需要和它進一步的通信。我們傳遞一個或者多個值讓Println函數打印,我們相信它會打印出這些值。但是有時候程序需要能夠調用函數並從那兒獲取數據。因此大多數編程語言中的函數都有返回值:函數計算後並返回給調用者的值。
math.Floor和strings.Title都是使用返回值的函數的示例。 math.Floor函數拿到一個浮點數,將其向下取整為最接近的整數,然後返回該整數。strings.Title函數拿到一個字符串,將它的包含的每個單詞的第一個字母大寫(首字母大寫),並返回大寫後的字符串。
要實際查看這些函數調用的結果,我們需要獲取它們的返回值並將其傳遞給fmt.Println
example2 :
package main import ( "fmt" "math" "strings" ) func main() { fmt.Println(math.Floor(2.75)) fmt.Println(strings.Title( "hello world!" )) }
go run example.go
輸出
2 Hello World!
說明:
fmt.Println(math.Floor(2.75))
math.Floor 取2.75的整數2返回給fmt.Println函數
strings.Title(“hello world”) 取一個字符串,然後將其中的每個單詞首字母大寫後返回給 fmt.Println函數
Go程序模板
對於下面的代碼,想像一下將它們插入到這個完整的Go程序中:
package main
import "fmt"
func main() {
fmt.Println("xxxxxxxxxxx") //在這裡插入你的代碼
}
更好的方法是,試着在Go Playground中輸入這個程序,然後一次插入一個片段,看看它們會做什麼!
字符串
我們將字符串作為參數傳遞給Println。字符串是一系列位元組,通常表示文本字符。你可以在代碼中直接使用字符串字面量來定義字符串: 雙引號之間的文本,Go將把它們視為字符串。
」hello world!「
在字符串中,換行符、製表符和其他難以包含在程序代碼中的字符可以用轉義序列來表示:反斜杠後跟表示另一個字符的字符。
轉義序列 | 值 |
\n | 換行符 |
\t | 製表符 |
\” | 雙引號 |
\\ | 反斜杠 |
符文
字符串通常用於表示一些列文本字符,而Go的符文(rune)則用於表示單個字符。
字符串字面量由雙引號(」)包圍,但rune字面量由單引號(『)包圍。
Go程序幾乎可以使用地球上任何語言的任何字符,因為Go使用Unicode標準來存儲runes。runes被保存未數字代碼,而不是字符本身,如果你把runes傳遞給fmt.Println,你會在輸出中看到數字代碼,而不是原始字符。
package main
import "fmt"
func main() {
fmt.Println('A')
fmt.Println('B')
fmt.Println('Z')
}
65
66
90
與字符串字面量一樣,轉義虛了也可以用在runes字面量中,用來表示程序代碼中難以包含的字符:
func main() {
fmt.Println('\t')
fmt.Println('\n')
fmt.Println('\\')
}
9
10
92
布爾值
布爾值只能是兩個值中的一個:true或false。它們對於條件語句特別有用,條件語句只在條件未true或者false時才會導致代碼段運行。
func main() {
fmt.Println(true)
fmt.Println(false)
}
true
false
數字
你可以直接在代碼中定義數字,它甚至比字符串字面量更簡單:只需輸入數字即可:
func main() {
fmt.Println(42)
fmt.Println(3.14159265)
}
42
3.14159265
稍後我們將看到,Go將整數和浮點數視為不同的數據類型,因此請記住,可以使用小數點來區分整數和浮點數。
數學運算與比較
Go的基本數學運算符的工作方式與大多數其他語言一樣。符號+表示加法,-表示減法,*表示乘法,/表示除法。
可以使用<和>來比較兩個值,看看其中一個值是否小於或者大於另一個值,可以使用==來查看兩個值是否相等,已經!=來查看兩個值是否不相等。<=測試第二個值是否大於或者等於第一個值,>=測試第二個值是否小於或者等於第一個值。
比較結果是一個布爾值,要麼true,要麼false
fmt.Println(4 < 6) | true |
fmt.Println(4 > 6) | false |
fmt.Println(2+2 == 5) | false |
fmt.Println(2+2 != 5) | true |
fmt.Println(4 <= 6) | true |
fmt.Println(4 >= 4) | true |
類型
在前面的代碼示例中,我們看到了math.Floor函數,它將浮點數向下取捨為最接近的整數,已經strings.Title函數,它將字符串轉換為首字母大寫。將數字轉換為參數傳遞給Floor函數,將字符串作為參數傳遞給Title函數,也是有意義的,但是如果將字符串傳遞給Floor,將數字傳遞給Title,會發生什麼呢?
package main
import (
"fmt"
"math"
"strings"
)
func main() {
fmt.Println(math.Floor("head first go"))
fmt.Println(strings.Title(2.75))
}
cannot use "head first go" (type untyped string) as type float64 in argument to math.Floor
cannot use 2.75 (type untyped float) as type string in argument to strings.Title
Go會打印兩天錯誤信息,一個函數調用有一條,程序甚至不能運行!
你周圍的事物通常可以根據它們的用途分為不同的類型,早餐不吃汽車或者卡車(因為它們是交通工具)。也不會開着煎蛋卷或者一碗麥片去上班(因為它們是早餐食品)。
同樣,Go中的值都被劃分為不同的類型,這些類型指定了這些值的用途,整數可以用在數學運算符中,但字符串不行,字符串可以大寫,但是數字不行,等等這些。。。
Go是靜態類型的,這意味着它甚至在程序運行之前就知道值得類型是什麼,函數期望它的參數具有特定得類型,它們的返回值也具有類型(可能與參數類型相同,也肯定不同)。如果你不小心在錯誤的地方使用了錯誤類型的值,Go會給你一個錯誤消息。這是一件好事:它讓你在用戶發現問題之前就發現了問題!
可以通過將任何值傳遞給reflect包的TypeOf函數,來查看它們的類型,讓我們看看對於已經看到的一些值,它們的類型是什麼:
package main
import (
"fmt"
"reflect" //導入reflect包以便使用TypeOf函數
)
func main() {
fmt.Println(reflect.TypeOf(42))
fmt.Println(reflect.TypeOf(3.1459265))
fmt.Println(reflect.TypeOf(true))
fmt.Println(reflect.TypeOf("Hello, world!"))
}
int
float64
bool
string
以下是這些類型的用途:
類型 | 描述 |
int | 整數,保存數字 |
float64 |
浮點數,保存帶小數部分的數字(類型中的64是因為要用64為的數據來保存數字。這意味着在四捨五入之前,float64值可以相當精確,但也不是無限精確。) |
bool | 布爾值,只能是true或false |
string | 字符串,通常表示文本字符的一系列數據 |
聲明變量
在Go中,變量是包含值得一塊存儲,可以使用變量聲明為變量命名,只需使用var關鍵字,後面跟所需得名稱以及變量將保存得值的類型。
var quantity int //quantity為變量名,int為變量將保存的值的類型。
var length, width float64 //可以一次聲明同一類型的多個變量
var customerName string
一旦聲明了一個變量,就可以用=(這是一個等號)為它分配該類型的任何值:
quantity = 2
customerName = "Damon cloe"
可以在同一語句中為多個變量賦值,只需將多個變量名放在=的左側,將數量相同的值放在右側,並使用逗號分隔。
lenth, width = 1.2, 2.4
一旦給變量賦了值,就可以在任何要使用原始值的上下文中使用它們:
package main
import "fmt"
func main() {
var quantity int
var length, width float64
var customerName string
quantity = 2
length, width = 1.2, 2.4
customerName = "Damon cloe"
fmt.Println(customerName)
fmt.Println("has ordered", quantity, "sheets")
fmt.Println("echo with an area of")
fmt.Println(length*width, "square meters")
}
Damon cloe
has ordered 2 sheets
echo with an area of
2.88 square meters
如果事先知道變量的值是什麼,可以什麼變量並在同一行賦值:
var quantity int = 4
var length, width float64 = 1.2, 2.4
var customerName string = "Damon Coie"
可以為現有的變量分配心值,但它們必須是相同類型的值。Go的靜態類型確保你不會意外第將錯誤類型的值賦給變量。
var quantity int = 4
var customerName string = "Damon Cole"
quantity = "Damon Cole"
customerName = 4
cannot use "Damon Cole" (type untyped string) as type int in assignment
cannot use 4 (type untyped int) as type string in assignment
如果在聲明變量的同時為其賦值,通常可以在聲明中省略變量類型,這個分配給變量的值的類型將作為該變量的類型。
func main() {
var quantity = 4
var length, width = 1.2, 2.4
var customerName = "Damon cloe"
fmt.Println(reflect.TypeOf(quantity))
fmt.Println(reflect.TypeOf(length))
fmt.Println(reflect.TypeOf(width))
fmt.Println(reflect.TypeOf(customerName))
}
int
float64
float64
string
零值
如果聲明一個變量而沒有給它賦值,該變量將包含其類型的零值。對於數值類型,零值實際上就是0:
var myInt int
var MyFloat float64
fmt.Println(myInt, MyFloat)
0 0
但是對於其他類型來說,0值是無效的,因此該類型的零值可能是其他的值。例如,字符串變量的零值是空字符串,布爾值變量的零值是false。
var myString string
var myBool bool
fmt.Println(myString, myBool)
string變量的零值是空字符串,bool變量的零值是false
false
段變量聲明
我們提到過,可以聲明變量並在同一行上為其賦值:
var quantity = 4
var length, width = 1.2, 2.4
var customerName = "Damon cloe"
但是,如果你聲明變量時就知道它的初始值時什麼,那麼更有代表性的時使用短變量聲明。不必很明確地聲明變量的類型並在之後使用=為其賦值,而是同時使用 “:=”。
package main
import "fmt"
func main() {
quantity := 4
length, width := 1.2, 2.4
customerName := "Damon Cole"
fmt.Println(customerName)
fmt.Println("has ordered", quantity, "sheets")
fmt.Println("each with an area of")
fmt.Println(length*width, "square meters")
}
Damon Cole
has ordered 4 sheets
each with an area of
2.88 square meters
不需要明確地聲明變量的類型;賦給變量的值的類型稱為該變量的類型。由於短變量聲明非常方便和簡潔,因此它們比常規聲明更常用。不過,仍然會偶爾看到這兩種形式,因此熟悉這兩種形式很重要。
命名規則
Go有一天簡單的規則,適用於變量、函數和類型的名稱:
- 名稱必須以字面開通,並且可以有任意熟悉的額外的字面和數字。
- 如果變量、函數或者類型的名稱以大寫字面開頭,則認為它是導出的,可以從當前包之外的包訪問。(這就是為什麼fmt.Println中的P時大寫的:這樣它就可以在main包或者任何其他包中使用。如果變量/函數/類型阿名稱是以小寫字面開頭的,則認為該名稱是未導出的,只能在當前包中使用。)
這些是該語言強制執行的唯一規則。但是Go社區還遵循一些額外的約定:
- 如果一個名稱由多個單詞組成,那麼第一個單詞之後的每個單詞都應該首字面大寫,並且它們應該連接在一起,中間沒有空格,比如toPrice、RetryConnection,等等。(名稱的第一個字面只有在你想從包中導出時才大寫)。這種樣式通常稱為駝峰大小寫,因為大寫字母看起來像駝峰。
- 當名稱的含義在上下文種很明顯時,Go社區的慣例是縮寫它:用i代替index,用max代替maximum,等等。
只有名稱是以大寫字面開頭的變量、函數或類型才被認為是可導出的:可以從當前包之外的包訪問。
轉換
Go中的數學運算和比較運算要求包含的值具有相同的類型。如果不是的話,則在嘗試運行代碼時會報錯。
var length float64 = 1.2
var width int = 2
fmt.Println("Area is", length*width) //如果我們在數學運算中同時使用float64浮點數和整型數...
fmt.Println("length > width?", length > width)
invalid operation: length * width (mismatched types float64 and int)
invalid operation: length > width (mismatched types float64 and int)
為變量分配新值也是如此,如果所賦值的類型與變量的聲明類型不匹配,也會報錯。
var length float64 = 1.2
var width int = 2
length = width
fmt.Println("Area is", length)
cannot use width (type int) as type float64 in assignment
解決方法是使用轉換,它允許你將值從一種類型轉換為另一種類型,只需要提供將值轉換的類型,後面緊接着是在圓括號中的要轉換的值。
var myInt int =2
float(myInt)
float64 為需要轉換的類型,myInt為要轉換的值
結果是所需類型的新值。下面是我們對整型變量中的值調用TypeOf,以及在轉換為float64後對相同的值再次調用TypeOf時得到的結果:
var myInt int = 2
fmt.Println(reflect.TypeOf(myInt)) //沒做轉換
fmt.Println(reflect.TypeOf(float64(myInt))) //做了轉換
int
float64
讓我們更新失敗的代碼示例,在任何數學運算中,或者與其他float64值進行比較前,先將int值轉換為float64值。
var length float64 = 1.2
var width int = 2
fmt.Println("Area is", length*float64(width)) //在講int數與另一個float64數相乘之前,先將其轉換為float64.
fmt.Println("length > width?", length > float64(width))
Area is 2.4
length > width? false
數學運算和比較現在都能正常工作!
現在讓我們嘗試在將一個int值轉換為float64之前,先把它賦值給float64變量:
var length float64 = 1.2
var width int = 2
length = float64(width) //在講int數賦值給float64變量之前,先將其轉換為float64。
fmt.Println(length)
同樣,轉換就緒後,賦值成功了。
在進行轉換時,請注意它們可能會如何更改結果值。例如,float64變量可以存儲小數值,但是int變量不能,當你float64轉換為int時,小數部分會被簡單的刪除!這可能會拋棄用結果執行的任何操作。
var length float64 = 3.75
var width int = 5
width = int(length)
fmt.Println(width)
3
不過只有你保存謹慎,你就會反省轉換在使用Go時時必不可少的,它們允許不兼容的類型一起工作。
在你的計算機上安裝Go
Go Playgroud時一種很好的嘗試語言的方法,但它的實際用途是有限的,例如,你不能使用它來處理文件,它沒有辦法從終端獲取用戶的輸入,而這些都是我們在即將推出的程序中所需要的。
所以,為了圓滿完成這一章,請在你的計算機上下載並安裝Go。
別擔心,Go團隊以及讓這項工作變得很容易了!對於大多數操作系統,只需要運行一個安裝程序就可以了。
1.在Web瀏覽器上訪問 //go.dev
2.點擊下載鏈接
3.選擇合適你的操作系統(OS)的安裝包。下載應該自動開始。
4.訪問適合你操作系統的「安裝說明」頁面(下載開始後,你可能會被自動帶到那裡),並按照那裡的說明進行操作。
5.打開一個新的終端或命令提升窗口
6.在提示符處輸入go version並按下enter鍵,確認Go安裝好了,應該能開到一條包含了所安裝的Go的版本信息的信息
編譯Go代碼
我們與Go Playground的互動包括了輸入代碼並神秘地運行它們,既然我們以及在你的電腦上安裝了Go,現在是時候仔細看看它是如何工作的了。
計算機實際上是不能直接運行Go代碼的,在此之前,我們需要獲取源代碼文件並進行編譯:將其轉換為CPU可以執行的二進制格式。
讓我們嘗試使用新安裝的Go來編譯和運行我們之前的例子「Hello, world!”
package main
import "fmt"
func main() {
fmt.Println("Hello world!")
}
1.使用你喜歡的文本編輯器,寫入以上代碼並命名為hello.go的存文本文件。
2.打開一個新的終端或者命令提示窗口
3.在終端上,切換到保存hello.go的目錄
4.運行go fmt hello.go整理代碼格式(這一步不是必需的,但無論如何這是個好主意)
5.運行go build hello.go編譯源代碼。這將向當前目錄添加一個可執行文件。在macOS或者Linux上,可執行文件將命名為hello,在window上,可執行文件將命名為hello.exe
6.運行可執行文件,在macOS或者Linux上,輸入./hello即可,在Windows上,輸入hello.exe。
go build hello.go
$ ./hello.exe
Hello world!
Go工具
當你安裝Go時,它會將一個名為go的可執行文件添加到命令提示符中,go可執行文件運訓訪問各種命令,包括:
命令 | 描述 |
go build | 將源碼文件編譯為二進制文件 |
go run | 編譯並運行程序,而不保存可執行文件 |
go fmt | 使用go標準格式重新格式化源文件 |
go version | 顯示當前Go版本號 |
我們剛剛嘗試了go fmt命令,它將你的代碼重新格式化為標準的Go格式,相當於Go Playground網站上的Format按鈕,我們建議對創建的每個源文件都運行go fmt。
我們還使用go build命令將代碼編譯成可執行文件,這樣的可執行文件可以分發給用戶,即使用戶沒有安裝Go,也可以運行它們。
但是我們還沒有嘗試go run命令,讓我們現在開始吧。
使用Go run快速嘗試代碼
go run 命令編譯並運行源文件,而不將可執行文件保存到當前目錄。非常適合快速嘗試簡單的程序,讓我們用它來運行hello.go示例。
1.打開一個新的終端或命令提示窗口
2.在終端上,切換到保存hello.go的目錄
3.輸入go run hello.go,然後按回車鍵,
你將看到程序輸出。如果對源碼進行更改,則不必執行單獨的編譯步驟,只需使用go run運行代碼,即可立即看到結果。當你在處理小程序時,go run 是一個很方便的工具!
函數調用
函數是一段代碼,你可以從程序的其他位置調用它。
調用函數時,可以使用參數向函數提供數據。
類型
Go中的值被分為不同的類型,這些類型指定了值得用途。
不同類型直接進行數學運算和比較是不允許的,但如果需要,可以將值轉換為新類型。
Go變量只能存儲其聲明的類型
要點
- 包是一組相關函數和其他代碼的組合
- 在Go文件中使用包的函數之前,需要先導入該包。
- string是一系列位元組,通常表示文本字符。
- runes表示單個文本字符。
- Go最常見的兩種數字類型是int(保存整數)和float64(保存浮點數)。
- bool類型保存布爾值,這些值要麼為true,要麼為false。
- 變量是一段可以包含指定類型值的存儲
- 如果沒有給變量賦值,它將包含其類型的零值。零值的示例包括對int或float64變量來說是0,對string變量來說是「」(空字符串)。
- 你可以使用 := 短變量聲明來聲明一個變量,並同時為其賦值。
- 如果變量、函數或類型的名稱以大寫字面開頭,則只能從其他包的代碼中訪問它們。
- go fmt命令自動重新格式化源文件以使用Go標準格式,如果你打算與其他人共享任何代碼,你應該歲它們運行go fmt。
- go build 命令將Go源代碼編譯成計算機可以執行的二進制格式。
- go run命令編譯並運行一個程序,而不將可執行文件保存在當前目錄中。