您好,登錄后才能下訂單哦!
這篇“Golang中的基礎語法有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Golang中的基礎語法有哪些”文章吧。
示例:工程結構如下
GOPATH 設置為工程根目錄(E:\GO_PROJECT)
test1.go
:
package package_test import "fmt" /* 定義函數 */ func Func1() { fmt.Println("test1 func1") }
test2.go
:
package package_test import "fmt" func Func2() { fmt.Println("test2 func2") }
testmain.go
:
package main import "dir1/dir2" // 導入的是【目錄名】 func main() { package_test.Func1() // 調用的是【包名】 }
運行:
// 方式一 go bulid testmain.go // 編譯(生成可執行文件) ./ testmain // 運行(可執行文件) //方式二 go run testmain.go // 編譯+運行
導包結論:
一個 GO 程序中一定要有 main 包和 main 函數,這是 GO 程序執行的入口。
編譯器會根據指定的相對路徑去搜索包然后導入,這個相對路徑是從 GOROOT 或 GOPATH(workspace)下的 src 下開始搜索:
GOROOT
項目 GOPATH
全局 GOPATH
GOlang 和 Java 的區別是,在 GO 中 import 的是目錄,而不是包名;并且 GO 沒有強制要求包名和目錄名需要一致,即包和目錄是兩個不同的概念。
import 導入的是源文件所在的目錄名,而不是定義的包名。
在代碼中引用包內的成員時,使用定義的包名而不是目錄名。
在習慣上將包名和目錄名保證一致,但這并不是強制規定。
在同一級目錄中,所有源文件只能使用相同的包名。
同一包名下的變量名、函數名等不能重復。
多個目錄下的相同包名,彼此無關。
包中的成員(如函數)以名稱?字母??寫,決定其訪問權限:
?字母?寫,可被包外訪問(即public
)
?字母?寫,僅包內成員可以訪問(即private
)
為了更好的管理項目中的文件,GO 要求將文件都要放在相應的目錄中,具體規定了以下目錄:
src 目錄
:以代碼包的形式組織并保存 GO 源碼文件(比如 .go 文件、.c 文件、.h 文件、.s 文件等)
pkg 目錄
:用于存放經由 go install 命令構建安裝后的代碼包(包含 GO 庫源碼文件)的 ".a" 歸檔文件。
bin 目錄
:與 pkg 目錄類似,在通過 go install 命令完成安裝后,保存由 GO 命令源碼文件生成的可執行文件。
以上目錄稱為工作區(Workspace),工作區其實就是一個對應于特定工程的目錄。
src 目錄用于包含所有的源代碼,是 GO 命令行工具一個強制的規則;而 pkg 和 bin 則無需手動創建,GO 命令行工具在構建過程中會自動創建這些目錄。
變量名必須以字母或下劃線開頭,后面可以跟任意數量的字母、數字或下劃線。
變量的三種聲明&初始化方式如下:
// 方式一:先聲明(有默認值),后賦值 var a int a = 10 var b, c string b = "b" c = "c" // 方式二:聲明+賦值 var a int = 10 // 方式三:自動推導類型(注意:這種方式只能在函數內使用) a := 10 b, c := 11, 12 b, c = c, b // 值交換 // 匿名變量 _, i, _, j = 1, 2, 3, 4
格式 | 含義 |
---|---|
%% | 一個 % 字面量 |
%b | 一個二進制整數值(基數為 2),或者是一個(高級的)用科學計數法表示的指數為 2 的浮點數 |
%c | 字符型。可以把輸入的數字按照 ASCII 碼相應轉換為對應的字符 |
%d | 一個十進制數值(基數為 10) |
%f | 以標準記數法表示的浮點數或者復數值 |
%o | 一個以八進制表示的數字(基數為8) |
%p | 以十六進制(基數為 16)表示的一個值的地址,前綴為 0x,字母使用小寫的 a-f 表示 |
%q | 使用 GO 語法以及必須時使用轉義,以雙引號括起來的字符串或者字節切片 []byte,或者是以單引號括起來的數字 |
%s | 字符串。輸出字符串中的字符直至字符串中的空字符(字符串以 '\0' 結尾,這個 '\0' 即空字符) |
%t | 以 true 或者 false 輸出的布爾值 |
%T | 使用 GO 語法輸出的值的類型 |
%x | 以十六進制表示的整型值(基數為十六),數字 a-f 使用小寫表示 |
%X | 以十六進制表示的整型值(基數為十六),數字 A-F 使用小寫表示 |
類型 | 名稱 | 長度 | 零值(默認值) | 說明 |
---|---|---|---|---|
bool | 布爾類型 | 1 | false | 其值不為真即為假,不可以用數字代表 true 或 false |
byte | 字節型 | 1 | 0 | uint8 的別名 |
int, uint | 整型 | - | 0 | 有符號 32 位或無符號 64 位 |
int8 | 整型 | 1 | 0 | -128 ~ 127 |
uint8 | 整型 | 1 | 0 | 0 ~ 255 |
int16 | 整型 | 2 | 0 | -32768 ~ 32767 |
uint16 | 整型 | 2 | 0 | 0 ~ 65535 |
int32 | 整型 | 4 | 0 | -2147483648 到 2147483647 |
rune | 整型 | 4 | 0 | int32 的別名 |
uint32 | 整型 | 4 | 0 | 0 到 4294967295(42 億) |
int64 | 整型 | 8 | 0 | -9223372036854775808到 92233720368547758070 |
uint64 | 整型 | 8 | 0 | 到 18446744073709551615(1844 京) |
float32 | 浮點型 | 4 | 0.0 | 小數位精確到 7 位 |
float64 | 浮點型 | 8 | 0.0 | 小數位精確到 15 位 |
string | 字符串 | - | "" | utf-8 字符串 |
值的字面量(literal)是指代碼中值的文字表示。一個值可能存在多種字面量表示。
表示基本類型值的文本稱為基本字面量。基本字面量也被稱為字面量常量或未命名常量。
示例:
func main() { var ch byte = 97 // 聲明字符類型 fmt.Printf("ch=%c", ch) // 輸出 a }
這里定義了 ch 是一個字符類型,賦值卻是一個整數 97,打印的結果是小寫字符 'a'。
原因是:計算機不能直接存儲字符類型,只能轉成數字存儲,那為什么小寫字符 'a' 對應的整數是 97 呢?因為計算機是根據 ASCII 碼來存儲的。
package main import "fmt" func main() { chinese := 97 math := 99 english := 96 fmt.Printf("總分是 %d,平均分(整數)是 %d, 平均分(浮點數)是 %f", chinese+math+english, (chinese+math+english)/3, float32(chinese+math+english)/3) // 總分是 292,平均分(整數)是 97, 平均分(浮點數)是 97.333336 }
注意:
GO 語言中不允許隱式轉換,所有類型轉換必須顯式聲明(強制轉換),而且轉換只能發生在兩種相互兼容的類型之間
var ch byte = 'c' // var a int = ch // cannot use ch (type byte) as type int in assignment var b int = int(ch) // 數據類型名(待轉換的值)
int 轉 float 強制轉換:多小數
float 轉 int 強制轉換:丟精度
package main import fmt func main() { var age int fmt.Println("請輸入年齡:") fmt.Scanf("%d", &age) // 將接收的值賦給age變量 fmt.Printf("age=%d", age) }
func main() { // 變量:程序運行期間,值可以改變,聲明使用var // 常量:程序運行期間,值不可以改變,聲明使用const const a int = 11 // a = 12 // error:常量不可以修改 const b = 12 // 自動推導類型(常量不可以使用:=) }
iota 常量生成器:用于生成一組遞增的整型常量,減去了每行都要寫一遍初始化表達式的繁瑣。
func main() { // 在一個 const 聲明語句中,在第一個聲明的常量所在的行,iota 將會被置為 0,然后在每一個有常量聲明的行遞增 1 const ( a = iota // 0 b = iota // 1 c = iota // 2 ) const d = iota // iota 遇到const,會被置為 0 // 可以只寫一個iota const ( e = iota // 0 f // 1 g ) // 同一行值一樣 const ( h = iota // 0 i, j, k = iota, iota, iota // 1 l = iota // 2 ) }
運算符 | 術語 |
---|---|
+ | 加(既可以完成兩個數字相加,又可以連接兩個字符串) |
- | 減 |
* | 乘 |
/ | 除 |
% | 取模(取余) |
++ | 后自增(GO 語言中沒有前自增) |
-- | 后自減(GO 語言中沒有前自減) |
運算符 | 說明 | 示例 |
---|---|---|
= | 普通賦值 | c = a + b 將 a + b 表達式結果賦值給 c |
+= | 相加后再賦值 | c += a 等價于 c = c + a |
-= | 相減后再賦值 | c -= a 等價于 c = c - a |
*= | 相乘后再賦值 | c *= a 等價于 c = c * a |
/= | 相除后再賦值 | c /= a 等價于 c = c / a |
%= | 求余后再賦值 | c %= a 等價于 c = c % a |
運算符 | 術語 | 示例 | 結果 |
---|---|---|---|
== | 相等于 | 4 == 3 | false |
!= | 不等于 | 4 != 3 | true |
< | 小于 | 4 < 3 | false |
> | 大于 | 4 > 3 | true |
<= | 小于等于 | 4 <= 3 | false |
>= | 大于等于 | 4 >= 1 | true |
運算符 | 術語 | 示例 | 結果 |
---|---|---|---|
! | 非 | !a | 如果 a 為假,則 !a 為真 如果 a 為真,則 !a 為假 |
&& | 與 | a && b | 如果 a 和 b 都為真,則結果為真,否則為假 |
|| | 或 | a || b | 如果 a 和 b 有一個為真,則結果為真,二者都為假時,結果為假 |
package main import "fmt" func main() { var score int fmt.Println("請輸入成績:") fmt.Scanf("%d", &score) // if 語句支持一個初始化語句+判斷條件 if good_score := 90; score >= good_score { fmt.Println("優秀") } else if soso_score := 60; score >= soso_score { fmt.Println("及格") } else { fmt.Println("需要努力") } }
注意:case 后面默認自帶 break
,如果想執行完成某個 case 后繼續執行后面的 case,可以使用 fallthrough 關鍵字。
func main() { bonus := 5000 var score string finish := true fmt.Println("請輸入年終評級:") switch fmt.Scanf("%s", &score); score { case "A": bonus += 1000 case "B": bonus += 5000 case "C": case "D": bonus -= 1000 default: finish = false fmt.Println("輸入有誤,請輸入正確的評級") } if finish { fmt.Printf("您的年終獎為:%d", bonus) } }
GO 中的 3 種循環方式:
package main import "fmt" func main() { // 第1種方式 for i := 0; i < 5; i++ { fmt.Printf("i=%d\n", i) } // 第2種方式:類似while循環 num := 1 for num < 5 { fmt.Printf("num=%d\n", num) num++ } // 第3種方式 for { fmt.Println("死循環") } }
函數就是將一堆代碼進行封裝,以便重用的一種機制。
func 函數名(){ 函數體 }
import "fmt" func MyFunc(a int, b int, args ...int) { // 注意:不定長參數必須放在參數列表最后 fmt.Println("定長參數為:", a, b) for i, data := range args { // 若不需要編號,則可使用 for _, data := range args fmt.Println("編號為:", i) fmt.Println("數據為:", data) } } func main() { MyFunc(1, 2, 3, 4, 5) }
打印結果:
定長參數為: 1 2
編號為: 0
數據為: 3
編號為: 1
數據為: 4
編號為: 2
數據為: 5
// 定義返回值類型 func Add(a int, b int) int { return a + b } // 給返回值命名 func Sub(a int, b int) (sub int) { sub = a - b return sub // 也可以只寫 return } // 返回多個值 func Sub(a, b, c int) { a, b, c = 1, 2, 3 return a, b, c // 也可以只寫 return }
在 GO 語言中還有另外一種定義使用函數的方式,就是函數類型。
所謂的函數類型,就是將函數作為一種類型可以用來定義變量,基本使用如下:
func Test(a, b int) int { return a + b } // 定義函數類型:即需要傳遞兩個整型參數,有一個整型返回值的函數類型 type FuncType func(a int, b int) int // type關鍵字后面跟著類型的名字(FunType) func main() { var result FuncType // 類型是FuncType類型,即函數類型 result = Test s := result(1, 2) fmt.Printf("s=%d", s) }
所謂匿名函數就是沒有名字的函數。匿名函數最主要的功能就是實現了閉包。
package main import "fmt" func main() { num := 9 // 使用方式一:定義匿名函數并賦值給變量 f1 := func() { // 在匿名函數中可以直接訪問main()中定義的局部變量 // 并且在匿名函數中對變量的值進行了修改,最終會影響到整個main()函數中定義的變量值 num++ fmt.Println("匿名函數:", num) } f1() // 10 fmt.Println("main函數:", num) // 10 // 使用方式二:通過函數類型 type FuncType func() // 沒有參數,沒有返回值 var f2 FuncType = f1 f2() // 使用方式三:直接調用 func(a, b int) { fmt.Println("a + b =", a+b) }(3, 6) // 有參有返回值的匿名函數 min, max := func(a, b int) (min, max int) { if a > b { return b, a } else { return a, b } }(12, 13) fmt.Printf("min=%d, max=%d\n", min, max) }
示例:階乘
func Test(num int) int { if num == 1 { return 1 } return num * Test(num-1) } func main() { var num int fmt.Println("請輸入需要階乘的數:") fmt.Scanf("%d", &num) fmt.Printf("%d的階乘結果為:%d", num, Test(num)) }
以上就是關于“Golang中的基礎語法有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。