golang基礎(一)go的特點、數據類型以及變數的定義
- 2020 年 3 月 26 日
- 筆記
靜態語言
靜態類型語言:與動態類型語言剛好相反,它的數據類型檢查發生在在編譯階段,也就是說在寫程式時要聲明變數的數據類型。C/C++、C#、Java都是靜態類型語言的典型代表。
動態語言
動態類型語言:是指在運行期間才去做數據類型檢查的語言。在用動態語言編程時,不用給變數指定數據類型,該語言會在你第一次賦值給變數時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言
強類型語言
強類型語言:使之強制數據類型定義的語言。沒有強制類型轉化前,不允許兩種不同類型的變數相互操作。強類型定義語言是類型安全的語言,如Java、C# 和 Python,比如Java中「int i = 0.0;」是無法通過編譯的
弱類型語言
弱類型語言:數據類型可以被忽略的語言。與強類型語言相反, 一個變數可以賦不同數據類型的值,允許將一塊記憶體看做多種類型,比如直接將整型變數與字元變數相加。C++、PHP都是弱類型語言,比如C++中「int i = 0.0;」是可以編譯運行的;
跨平台編譯型語言
可以跨平台編譯,可以在windows系統下編譯Linux系統運行的程式,也就是在這個平台可以編譯另一個平台的可執行文件。
go就可以跨平台編譯,python則需要安裝python解釋器而且不同平台安裝python解釋器的方式還是不一樣的,java需要安裝java虛擬機(jdk)不同平台安裝方式也是不同的,c/c++需要在不同平台上現場編譯,這樣go的優勢就凸顯出來了。使用go可以在自己的電腦上寫好直接編譯成伺服器可以執行的文件拿過去運行就可以了,省去了搭建環境的繁瑣步驟。
go的特點:垃圾回收機制、支援面向對象和面向過程(go不是一門純粹的面向對象語言,沒有類的概念,但可以實現面向對象的特性:繼承、封裝、多態)
go的源碼是由c寫起來的,1.5以後是自己寫自己,這一點和python是類似的python源碼期初也是用c/c++寫的,後來就自己寫自己。
目前go的使用:各大互聯網公司的運維、後端都有使用go,比較流行的k8s(容器編排)使用go寫的,由於區塊鏈的第一個開源項目使用go寫的,所以在做區塊鏈時用go的也比較多。
目前go的劣勢是語言新,模組少。
go語言的前景
go出現的比較晚,具備其他語言所不具有的先天優勢:更加適合現代處理器的多核運行,編程上也綜合了前面程式語言的優勢,有人說go將會稱霸程式語言的下一個十年。
開發環境的安裝
一、安裝開發環境
二、IDE的安裝
go的數據類型
說明:go和python不同,go的程式碼和縮進沒有關係。
數字
int
int:默認是電腦的執行位數,如32位電腦則是int32,
int8:存儲長度是8個比特位,第一位表示正負號,後七位表示內容可表示正2^7-1,下面同理
int16
int32
int64
uint:正整數
uint8:八個bit都表示內容,也就是可以表示[0,2^8-1),所以unit8別名byte(位元組)
uint16
uint32:別名rune,4個位元組,表示一個字元
uint64
float
float32
float64
complex(複數)
complex32
complex64
字元串
string:雙引號引起來的是字元串,注意這裡必須是雙引號,單引號三引號都不行,單引號會將引在裡面的字元的對應的ASCII碼編號列印出來。反引號是支援換行的字元串。
布爾
這裡的bool類型只有:true和false兩種狀態
0,1和bool沒有關係
常量
這裡的常量是不可變得,如果修改了會報錯,不可以簡略聲明。通常用來定義資料庫連接地址,埠號等
package main import "fmt" const name = "zgh"//常量的定義 const name1,age = "zgh",20//一次定義多個常量 func main(){ }
go中的注釋
單行注釋//
多行注釋/*要注釋的內容*/
go的注釋方式是從C繼承過來的,除了C語言JavaScript也使用這樣的注釋方式。
程式碼編寫規則
package main // 必須指明是哪個包 main包 //表示導入fmt包,對比python即可 import "fmt" func main() { //定義了一個main函數 fmt.Println(a..."hello world") //列印出helloworld } /*注意: 1.go的程式碼必須在main函數中寫,go程式的入口是main包下的main函數,這點和C語言相似 2. fmt.Println("hello world") 你看到的a... 其實是goland給你提示的,函數的形參是a...,在其他IDE下是沒有a...的 3.go語言中,包導入必須使用,否則報錯,注釋掉,包自動刪除(goland做的,其他編輯器,沒有) 4.go文件名不能和main函數等函數名或者包名重名,否則會報錯 */
來對比一下C語言
#include <stdio.h> int main() { /* 我的第一個 C 程式 */ printf("Hello, World! n"); return 0; } /* 所有的 C 語言程式都需要包含 main() 函數。 程式碼從 main() 函數開始執行。 printf() 用于格式化輸出到螢幕。printf() 函數在 "stdio.h" 頭文件中聲明。 stdio.h 是一個頭文件 (標準輸入輸出頭文件) , #include 是一個預處理命令,用來引入頭文件。 當編譯器遇到 printf() 函數時,如果沒有找到 stdio.h 頭文件,會發生編譯錯誤。 return 0; 語句用於表示退出程式 */
go程式碼的執行
//執行go程式碼 1 goland上點擊右鍵 Run 就可以執行(僅限於goland,vs code等其他編輯器都沒有run) 2 先編譯,再執行正統的用法(go是編譯型語言),用命令 編譯:go build s1.go 編譯,編譯成當前平台的可執行文件 s1.exe 執行:s1.exe 3 編譯並執行(在vs code上的命令窗口下執行go文件) go run s1.go 相當於2中的所有步驟,不產生可執行文件 s1.exe
定義變數的三種方式
package main import "fmt" func main(){ //fmt.Println("hello world") //1 第一種:全定義 //var關鍵字 變數名 變數類型 = 變數值 var a int = 10 fmt.Println("a:",a) //2 第二種:類型推導(自動推導出變數類型) var b = 10 fmt.Println("b:",b) //3 第三種:簡略聲明(這個用的多) 冒號跟等號是一起的 c := 10 fmt.Println("c:",c) //4 只定義變數,不賦值 var d int fmt.Println("d:",d) //5 聲明多個變數,三種方式都可以 //var e,f,g int = 1,2,3 //var e,f,g = 10,11,"xxx" e,f,g := 10,11,"xxx" fmt.Println("e:",e,"f:",f,"g:",g) //6 變數不能重複定義 //var h int //var h = 90//重複定義會報錯 //h := 90//重複定義會報錯 //h = 90//重複定義會報錯 var h int //var h,i = 10,20//重複定義會報錯 h,i := 10,20//允許(特殊情況) fmt.Println(h,i) } /* 總結: 1 變數定義了必須使用,否則報錯(只有go要求這樣) 2 查看變數沒寫 3 變數要先定義再使用 4 變數類型是固定的,不允許中途改變(靜態語言) 5 如果只是定義變數,必須指定類型,只能用第一種定義方式 6 變數不允許重複定義 強調: 之後所有類型的變數定義都參照前三種定義變數的方式 */
a: 10 b: 10 c: 10 d: 0 e: 1 f: 2 g: 3 e: 10 f: 11 g: xxx e: 10 f: 11 g: xxx