麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 編程設計 > 正文

LiteIDE開發工具簡明使用指南(Go語言基礎學習)

2020-07-14 13:32:27
字體:
來源:轉載
供稿:網友

谷歌系統所使用的編程語言Go,近年來發展的越來越成熟、方便易用?,F在,我們可以通過使用LiteIDE讓Go語言編程變得更加簡單。

第一步 語言基礎

數據、類型、函數、控制
Go語言是一個很容易上手同時功能無比強大的編程語言。你可以將它看做是C的現代版,至于更多的東西,還有待你自己去發掘。Go語言有著清晰簡明的靜態語法結構,但它表現出來的確是一種動態的效果。它還可以編譯成本地代碼,但卻像解釋性語言那樣去工作。
總的來說,Go語言是一門完全值得你去嘗試的語言,同時本文將告訴你一切你上手這門語言所需要知識。在第二部分,我們將重點分析Go語言是如何處理對象和并發的。
 
 安裝 

安裝和配置Go語言,你只需要下載合適的二進制文件至正確的位置,再為Go工具定位那些文件所在的目錄路徑就好了。 

如果你使用的是OSX或Windows操作系統,那么你可以使用安裝包來完成這一些列工作。
在Windows下,我推薦MSI安裝包,這個安裝包雖然還在試驗中,但其實它的表現非常不錯,它能迅速地為你完成配置工作。 你需要的只是根據你的系統下載32位或64位安裝包然后在你的電腦上運行就好了。
安裝程序會默認在C:/Go目錄進行安裝。

install



你可以通過下面的小程序驗證環境是否搭建完成:

復制代碼
代碼如下:

package main
import "fmt"
func main() {
fmt.Printf("hello, world/n")
}

你可以使用記事本或其他文本編輯器編輯上面這段代碼,并將代碼保存為hello.go文件。然后打開終端,輸入:

go run hello.go

接下來你就可以進行LiteIDE的安裝并嘗試運行程序了。
不管從什么方面來說,LiteIDE并不是編寫Go程序的必備工具,你所需要的只是一個編輯器而已。這樣說的確沒錯,但是對于一個新人,一個好的IDE可以使他更容易上手一門語言,并迅速投入開發。
美中不足的是,LiteIDE沒有使用手冊。
你可以從下面的網址上下載tar或zip壓縮包

https://code.google.com/p/golangide/ 

下載完成后將其解壓至合適的目錄。如果你是用的是Windows,那你可能需要使用7z來解壓。

如此簡潔的安裝過程必然不會為你創建快捷方式,因此你可能需要打開.../liteide/bin然后找到liteide.exe并手動創建快捷方式。
 
打開LiteIDE后你會看到歡迎界面:

liteidewelcome

 現在我們暫時無需理會這些組件,讓我們先從一個簡單的小程序開始。
在工具欄上選擇File->New或直接在歡迎界面上點擊New按鈕,在彈出的對話框中選擇Go1 Command Project。LiteIDE將為你創建一個Go控制臺工程,工程目錄放在C:/Go/src下。如果你為你的項目起名Hello,那你的代碼文件將被放在 C:/Go/src/Hello下。

newproject




復制代碼
代碼如下:

LiteIDE會預先為你在工程目錄下創建main.go和doc.go文件。main.go文件中包含以下內容: </p><p>// Hello project main.go
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello World!")
}

你可以點擊工具欄上藍色的編譯執行按鈕BR運行代碼。你可以在在Build菜單中的B和BR按鈕菜單中找到更多的關于編譯和執行代碼的命令。
如果你運行了你的程序,你可以在底部的編譯輸出(Build Output)窗口中看到程序運行結果。

buildoutput 

如果程序沒有運行,那么很有可能是你創建的工程類型不對或者文件路徑錯誤。
LiteIDE中還有很多功能等待你去發掘,不過目前為止的這些已經足夠我們使用Go語言了。
 
變量和簡單數據類型
Go語言包含了你所期望的所有從uint8 到 float64的簡單數據類型。


復制代碼
代碼如下:

uint8 無符號8位 整型數(0 到 255)
uint16 無符號16位 整型數(0 到 65535)
uint32 無符號32位 整型數(0 到 4294967295)
uint64 無符號 64位 整型數(0 到 18446744073709551615)</p><p>
int8 8位 整型數(-128 到 127)
int16 16位 整型數(-32768 到 32767)
int32 32位 整型數(-2147483648 到 2147483647)
int64 64位 整型數(-9223372036854775808 到 9223372036854775807)</p><p>
float32 IEEE-754 32位 浮點數
float64 IEEE-754 64位 浮點數</p><p>
complex64 復數 32位實數+32位虛數
complex128 復數 64位實數+64位虛數</p><p>
byte uint8的別稱
rune int32的別稱

最大的驚喜就在于,Go語言支持復數類型的數據:

復制代碼
代碼如下:

var z complex64
z = 1.0 + 2.0i
fmt.Println(z)

如果你想知道rune是什么,那么當你知道rune被用來存儲一個Unicode字符的時候,這個問題也就應該迎刃而解了吧。換句話說,rune在Go語言中等價于字符(char)類型。

當然你也可以使用uint、int卷二uintptr這些依賴于系統類型(32位或64位)的整數類型。

另外一個新穎的地方,當你定義一個變量的時候,你變量的后面對其類型進行定義,而不是在前面。

當你在定義中初始化了變量,你無需對變量指定數據類型。如果在定義的時候未初始化,則變量將會被賦予0值:

var i=0
var x,y float32=1.0,2.0

和數字類型一樣,Boolean 類型也有相似的特征。

編譯器會完成相應的工作。

一個使用Go語言定義和初始化變量的簡單例子:

x,y:=1,2

你也可以定義和使用常量。

 數據結構
常用的數據結構有字符串(strings),數組(arrays)和結構體(structs),以及另一位頗受歡迎的成員map。

字符串是Unicode編碼,其值不能修改,而其他方面和你想的差不多。

s="Hello"

可以使用len函數獲取字符串的長度,使用索引操作符[0]可以訪問字符串中的字符。Go語言中的字符串類型相當簡陋,但使用stirng package可以實現類似其他語言字符串的所有功能。

數組(arrays)以中括號([])聲明,索引從零開始。例如:

復制代碼
代碼如下:

var buff [32]byte
fmt.Println(buff[10])

多維數組通過數組的數組實現,

復制代碼
代碼如下:

var buff [32][32]byte
fmt.Println(buff[10][0])

數組(array)不是動態的,不能動態分配大小。但可以使用切片(slice)實現同樣的效果。切片包含數組(array)的一部分,可以動態變更大小。
結構體(structs)與其他語言類似,如下:


復制代碼
代碼如下:

func main() { </p><p> type point struct {
x, y int
}
var p = point{10, 10}
fmt.Println(p.x)
}

上例聲明了新的結構體類型,包括兩個成員x和y。在main函數中創建并初始化了該結構體類型的實例(instance)。Go語言通常不使用術語“實例(instance)”,而更喜歡使用術語“值(value)”,所以你是創建了該類型的一個值(value)。
結構體定義中可以嵌套結構體作為成員。初始化器(initializer){10,10}是結構體literal(譯注:literal可以理解為立即數,見維基)。在結構體literal中也可以使用成員名例如{X:10}。

這是我們首次介紹Go類型,關于這個話題之后還有更多內容。
最后一個數據類型是Map,等價于其他語言中的hash map,關聯數組(associative array)或者字典(dictionary)。
給定鍵的類型以及值的類型就能創建Map。如果從來沒有使用過關聯數組,那就把它想象成一個數組,數組的值不是通過索引訪問,而是通過通用類型的鍵訪問。例如。:


復制代碼
代碼如下:

var m = make( map[string]int)
m["mike"] = 10
m["lucy"] = 30
fmt.Println(m["lucy"])

顯示結果是30.

make函數是能夠基于Type(類型)創建Value(值)(譯注:可以理解為實例)的兩個函數之一,要詳細了解它,我們需要學習更多關于類型的內容。

類型
在Go語言中,類型特指一系列的值和操作。Go語言的類型起到的作用與眾所周知的面向對象的設計語言(Java、C++)有很大的不同,它沒有所謂的層次劃分、沒有類的概念也不存在繼承。類型是可以被推斷出來的,如:Go使用鴨子類型。

你可以用一個立即數(literal )或指定的類型來定義一個類型變量,以達到類型重用的目的。

自定義類型是由一些小的數據類型整合而成的,如數組、結構體、指針、很熟、接口、片、map和channel。

定義類型的方法:

type 類型名 數據類型

例:

type myint int

定義myint為一個整型類型。如果你想創建一個擴展類型,重新定義之前聲明過的類型的數據類型也很常用,實現的函數和方法我們之后再講。

更為通常的做法,你可以使用某些數據類型組成你自定義的類型:

復制代碼
代碼如下:

type point struct {
x, y int
}

這就是一個新的類型結構。

你也可以聲明數組類型: 

type myarray [20]int

你可以在定義類型時使用自定義類型:

復制代碼
代碼如下:

type point struct {
x, y int
}
type arrayPoints [10]point

這就創建了一個point類型的數組。

你可以自行探索其他的類型定義方式。接下來我們要做的是理解Go能用這些類型完成什么工作?

類型主要被用于下面兩個方面:

類型檢測

創建值
類型檢測很常見——你只能賦予你定義的變量與之相同類型的值。在編譯時編譯器會依此對靜態類型進行檢查。

例:

復制代碼
代碼如下:

var c myint
c = "string"

上面的代碼編譯將不會通過。但下面的代碼:

復制代碼
代碼如下:

var c myint
c = 1

將會通過編譯。因為“c”和“1”都是整型數據。
類型所做的第二件事:在你用類型聲明變量時構造對應類型的變量。如:

var i int

var p point

但對于slice(片)、map和channel來說他們必須使用make函數創建對應類型的值。


復制代碼
代碼如下:

var m = make( map[string]int)

make函數是Go語言支持的兩個分配函數中的一個,另一個是new函數。make函數創建了一個指定類型的值,并把該值得指針返回給變量。在大多數地方,Go中的指針與C中的指針使用方法類似。
你可以使用*引用一個指針的值,也可以用&獲取值得地址。但是,Go和C的指針也存在差異,這種區別在于Go語言不存在指針計算。在Go語言中,指針存在的意義是讓你可以用引用的方式在函數之間傳遞參數。 如果你有一個類型T,那么*T就是一個指向類型T的指針。

舉一個new函數的例子:

復制代碼
代碼如下:

var add= new(int)

在這里,new函數創建了一個整型變量并放回了它的地址存放在add中。變量add的類型為*int。

如果你寫出如下語句

復制代碼
代碼如下:

fmt.Print(add)

那么你將得到這個整型值得地址。那么,為了打印這個整型變量的值,我們需要這樣書寫打印語句:


復制代碼
代碼如下:

fmt.Print(*add)

就像之前提到過的那樣,你可以直接使用類型的值而無需給這個類型命名:


復制代碼
代碼如下:

var p struct {
x, y int
}

如果你不需要重用這個類型,那么這樣做也是可以的。

函數
Go不是一種基于類并且有層次結構的語言,也不使用通常的方式處理對象。如果你僅僅打算實現一個函數,那就不用考慮有關對象的內容。函數就是一個值(Values),是“一等對象“。
如下,聲明一個函數

復制代碼
代碼如下:

var myFunc = func(a, b int) int {
return a + b
}

可以指定參數類型和返回值類型,如果指定了返回值類型,則函數中必須有return語句。

函數值(value)被賦值給了變量myFunc。也可以按照通常的方式定義函數,這是變量myFunc就是函數的名稱。

復制代碼
代碼如下:

func myFunc(a, b int) int {
return a + b
}

無論那種方式,函數都可以使用下面的方式調用:


復制代碼
代碼如下:

fmt.Println(myFunc(1, 2))

可以在return語句中返回多個值,并且可以在函數頭中指定返回值的名稱。

例如:

復制代碼
代碼如下:

func myFunc(a, b int) (sum int) {
sum = a + b
return
}

sum就是函數的返回值。

返回多個值也很簡單:

復制代碼
代碼如下:

func myFunc(a, b int) (int, int) {
return a + b, a - b
}

必須全部接收函數的兩個返回值:

復制代碼
代碼如下:

x,y := myFunc2(1, 4)
fmt.Println(x,y)

其他語言中可以選擇只接收一個返回值,但在Go語言中不可以。

傳值——指針
所有的形參都是以傳值的方式傳入,所以對形參做的任何改變都不會影響實參。例如:

復制代碼
代碼如下:

func myFunc(a, b int) int {
a = 1
return a + b
}

函數中對形參a的賦值語句,對實參沒有任何影響。就是說

復制代碼
代碼如下:

x, y := 2, 3
var sum = myFunc(x, y)
fmt.Println(sum, x)

顯示結果是4和2。x的值沒有變化。

如果想要改變實參的值,就需要傳入指針(譯注:即傳地址或傳引用)作為參數。例如,變更函數定義如下:


復制代碼
代碼如下:

func myFunc(a *int, b int) int {
*a = 1
return *a + b
}

參數a以指針的形式傳入,對a的賦值語句改變a指向的變量。調用函數時,我們需要傳入變量的地址作為參數:


復制代碼
代碼如下:

var sum = myFunc(&x, y)
fmt.Println(sum, x)

現在顯示結果是4和1,x的值變更了。
*和&操作符的用法對C程序員來說是非常熟悉的,這體現了Go語言較為初級的一面。有爭議說在現代語言中所有的參數都應該以傳引用的方式傳入。

如果函數定義中的參數是*int類型,而調用該函數時沒有使用&操作數,那么在編譯階段類型檢查時就會報錯,而C語言沒有這個功能。

總之,Go語言的指針類型,可以作為實參傳遞給函數,但無法在數據上耍一些”聰明“的技巧。

作用域和閉包
你可以以嵌套的方式在函數中定義函數。在某塊代碼中定義的變量只會在該塊代碼區域和該代碼區域內的區域生效。這意味著你可以在函數之外定義全局變量,那么所有的函數將都能使用這個變量。

例:

復制代碼
代碼如下:

var a1 int = 1
func main() {
fmt.Println(a1)
var a2 int = 2
var myFunc = func() int {
return a2
}
fmt.Println(myFunc())
}

在這個例子中,a1是一個全局變量,可以被所有函數訪問。a2在main函數內定義,因此它可以被main函數和main中的myFunc函數訪問。
Go同樣支持閉包。如果你在一個函數中定義了另一個函數,那么這個在內部的函數將能夠訪問外部函數的變量,即使外部函數已經終止運行。在外部函數停止后保持內部函數的唯一方法是將其作為一個返回值返回給外部函數。

例: 

復制代碼
代碼如下:

func myFunc() func() int {
var a int = 1
return func() int {
return a
}
}

在這里,內部函數以func() int的方式返回給外部函數。函數和它的內容都是以類型的方式返回的。返回的函數將會返回外部函數定義的變量的值,這就是閉包的作用。

因此


復制代碼
代碼如下:

myClosure := myFunc()
fmt.Println(myClosure())

輸出結果為 1.

每個閉包都有一份與自己綁定的變量副本,閉包不會實現不同函數副本之間的數據共享。
 Go 控制
現在我們已經了解過了數據、類型和函數。接下來我們將討論另一個重要的問題:Go語言提供的控制語句。

實際上,Go語言只提供了很少的控制結構,它極大簡化了控制語句的使用。
Go語言是一種塊結構的編程語言,它使用"{}"將一組代碼組成塊。如果你一直在奇怪其他編程語言中經常使用的“;”去了哪里,我可以很明確的告訴你,在Go中它依然存在,只是在編譯過程中它會自動為你加上“;”。如果你也在代碼末尾加上分號,那么編譯器將會認為它們是不需要的字符,從而自動剔除這些分號。
for循環是Go語言中的唯一一種循環。for循環可以被用來創建條件循環和枚舉循環。
for循環具有下面這種形式:

復制代碼
代碼如下:

for 條件{
操作
}

需要注意的是,你無需將循環的條件置于一對大括號“{}”中。循環將會在不滿足條件時終止。循環將會在每次執行循環體前檢查條件是否滿足,因此循環體可以被執行0次或很多次,類似于while循環。
例:

復制代碼
代碼如下:

i:=0
for a<10 {
fmt.print(a)
a=a+1
}

你可以通過使用for true {" 或者 "for {" 來創建一個不會終止的循環。

復制代碼
代碼如下:

枚舉循環與其他類似C的語言基本相同:
for 表達式1 ; 條件 ; 表達式3{
操作
}

表達式1會在循環開始前執行一次,表達式3會在每次循環體執行結束后執行一次,條件語句會在每次循環體執行之前被檢查,如果為true則繼續執行循環。
例:

復制代碼
代碼如下:

for i:=0; i<10; i++ {
fmt.print(a)
}

你可以在for表達式中加入任何語句,但前提是你得加入分號以區分你的語句屬于表達式的哪個部分。但也有一種情況例外,你創建的條件表達式無需條件語句。
你也可以在for表達式中反復申明數組、片、字符串、map或channel中的值,用法與其他語言中的for循環類似。
例如:

復制代碼
代碼如下:

var array= [] int {1,2,3,4}
for i,v:= range array {
fmt.print(i,v)
}

for表達式的循環次數取決于索引和數組的大小,好比這里的i和v。
 
在Go語言中,還存在另外兩種控制語句。if語句除了沒有大括號包圍的條件語句外,與其他語言中的if語句基本相同。
例:

復制代碼
代碼如下:

if a<0 {
fmt.print("Negative")
} else {
fmt.print("Positive")
}
else條件不是必須的,但一對大括號必須完整:
if a<0 {
fmt.print("Negative")
}

你也可以通過使用else if創建一個符合條件表達式:

復制代碼
代碼如下:

if a<0 {
fmt.print("Negative")
} else if a==0 {
fmt.print("Zero")
} else {
fmt.print("Positive")
}

你也可以在if主體內容執行之前執行初始化語句:

復制代碼
代碼如下:

if a:=myfunc() a<0 {
fmt.print("Negative")
}

所有在條件語句中創建的變量,只在條件表達式中適用。
另一種條件表達式為switch,它的存在是為了應對在一個條件中有較多選項的情況。如:

復制代碼
代碼如下:

switch a {
case 0,1:
fmt.print("a is 0 or 1)
case 2.3:
fmt.print("a is 2 or 3)
default:
fmt.print("a is some other value")
}

你也可以用下面的方式書寫條件語句:

復制代碼
代碼如下:

case a<0:

在Go語言中,你無須用break跳出條件選擇。如過你想從一個case進入接著的另一個case,那么你可以使用fallthrough語句 (注:fallthrough表示繼續執行下面的Case而不是退出Switch)。case語句是按順序執行的,一旦有相對應的情況,執行完case中的語句后程序將會自動調用break跳出選擇,因此default選項往往被放在最后。
除了對值和條件的匹配,你可以對類型進行匹配,如:

復制代碼
代碼如下:

switch a.type{
case int:
fmt.print("a is an int")
case float64:
fmt.print("a is a float")
default:
fmt.print("some other type")
}

最后,你可以使用break終止循環或continue終止當前循環并直接進入下一次循環,break也可以被用于switch語句中。
雖然Go語言中也有goto語句,但這還是不講為好。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美国产综合视频 | 国产精品刺激对白麻豆99 | h视频免费观看 | 亚洲尻逼视频 | va毛片| 久久久久成人免费 | 亚洲成人福利在线 | 国产在线观看免费视频软件 | 56av国产精品久久久久久久 | 久久久久性 | av免播放 | 精品久久久久久综合日本 | 国产视频在线观看免费 | 毛片视频网址 | 免费视频www在线观看 | 免费在线观看国产精品 | 国产亚洲精品综合一区91 | 在线观看91精品 | 黄色影院网站 | 成人做爰s片免费看网站 | 国内毛片视频 | 国产精品99久久久久久久vr | 成人在线网站 | 国产精品一二区 | 在线高清中文字幕 | 国产性tv国产精品 | 欧美成人免费 | 国产成人免费精品 | 成人免费自拍视频 | 国产人妖一区二区 | 国产视频第一区 | 久国产| 91短视频在线播放 | 成人黄色小视频网站 | 91短视频在线观看视频 | 爱看久久 | 末成年女av片一区二区 | 黄色一级电影网 | 一级黄色毛片免费 | 免费黄色在线电影 | 一级空姐毛片 |