本文介紹一些Go語言的基礎(chǔ)語法。
成都創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、臥龍網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、成都做商城網(wǎng)站、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為臥龍等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標(biāo)準(zhǔn)庫,
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問中的fmt包。
log包實現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語言的運算符主要包括算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關(guān)運算符。
算術(shù)運算符:
關(guān)系運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關(guān)運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過標(biāo)記退出循環(huán):
--THE END--
golang方法(method)返回值提取結(jié)構(gòu)體(struct)取不到地址的原因是,①返回值并沒有保存到變量中,返回值本身只是臨時保存在程序運行的堆棧的某個不確定位置,不能取地址;②實參取地址用的操作符是是,而形參聲明變量類型為指針,需要地址值用的才是*;③聲明形參為指針的參數(shù)的實參只能為地址值。
故先把修改后的代碼列出,修改要點是把“*NewPerson1().Speak()”改為“var b=NewPerson1();(b).Speak()”,同時把“NewPerson2().Speak()”改成“var a=NewPerson2();(a).Speak()”,代碼列出如下:
package main;
import "fmt";
type PersonA struct{
name string
}
func (p *PersonA) Speak () {
fmt.Println ( "person speak" ,p.name)
}
func (p PersonA) Walk ( ){
fmt . Println ( "person walk",p.name)}
func NewPerson1()(p PersonA){
return PersonA{"new Person1"}}
func NewPerson2()(p PersonA){
return PersonA{"new Person2"}}
func main () {
var a=NewPerson2 (); (a).Speak ();?
a .Walk ();
fmt. Println ("--------------------")?;
var b=NewPerson1 ();(b).Speak ();
b.Walk ()}
go代碼調(diào)試效果
關(guān)于指針變量的使用這一點go語言和其他有指針的程序語言如c語言是一樣的,從來只有返回值為地址/指針,而從沒有在賦值前給返回值取地址這種運算,類似的錯誤晚點再整理。
不一樣的是,go語言更簡單go語言函數(shù)可以使用結(jié)構(gòu)體或者結(jié)構(gòu)體的指針(pointer)以傳遞結(jié)構(gòu)體參數(shù),而且和c語言不一樣的是,go語言沒有區(qū)分結(jié)構(gòu)體指針和結(jié)構(gòu)體訪問成員的運算符,go語言只有“.”適用于兩種情況,而沒有c語言為結(jié)構(gòu)體指針專門準(zhǔn)備的“-”運算符。
可以使用結(jié)構(gòu)體指針,作為結(jié)構(gòu)體的方法的參數(shù)以指代自身嗎,
1、new 的主要特性
首先 new 是內(nèi)建函數(shù),定義也很簡單:
func new(Type) *Type
內(nèi)建函數(shù) new 用來分配內(nèi)存,第一個參數(shù)是一個類型,不是一個值,返回值是一個指向新分配類型零值的指針
實現(xiàn)一個類似 new 的功能:
func newInt() *int {
var i int
return i
}
someInt := newInt()
函數(shù)的功能跟 someInt := new(int) 一模一樣。定義 new 開頭的函數(shù)時,出于約定也應(yīng)該返回類型的指針。
2、make 的主要特性
make 也是內(nèi)建函數(shù),定義比 new 多了一個參數(shù),返回值也不同:
func make(Type, size IntegerType) Type
內(nèi)建函數(shù) make 用來為 slice,map 或 chan 類型分配內(nèi)存和初始化一個對象(注意:只能用在這三種類型上),跟 new 類似,第一個參數(shù)也是一個類型而不是一個值,跟 new 不同的是,make 返回類型的引用而不是指針,而返回值也依賴于具體傳入的類型,具體說明如下:
Slice: 第二個參數(shù) size 指定了長度,容量和長度相同。
可以傳入第三個參數(shù)來指定不同的容量值,但必須不能比長度值小。
比如 make([]int, 0, 10)
Map: 根據(jù) size 大小來初始化分配內(nèi)存,不過分配后的 map 長度為 0,如果 size 被忽略了,那么會在初始化分配內(nèi)存時分配一個小尺寸的內(nèi)存
Channel: 管道緩沖區(qū)依據(jù)緩沖區(qū)容量被初始化。如果容量為 0 或者忽略容量,管道沒有緩沖區(qū)。
3、總結(jié)
new 的作用是初始化一個指向類型的指針(*T),make 的作用是為 slice,map 或 chan 初始化并返回引用(T)。
沒有的,go中只能這樣
var a int
if x 0 {
a = 1
} else {
a = 2
}
左移運算符()
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a 2 將a的二進制位左移2位,右補0,
左移1位后a = a * 2;
若左移時舍棄的高位不包含1,則每左移一位,相當(dāng)于該數(shù)乘以2。
右移運算符()
將一個數(shù)的各二進制位全部右移若干位,正數(shù)左補0,負數(shù)左補1,右邊丟棄。
操作數(shù)每右移一位,相當(dāng)于該數(shù)除以2。
例如:a = a 2 將a的二進制位右移2位,
左補0 or 補1 得看被移數(shù)是正還是負。
運算符用于在程序運行時執(zhí)行數(shù)學(xué)或邏輯運算。
1.算術(shù)運算符
Go 語言的算術(shù)運算符如圖,假設(shè)A值為10,B值為20。
2.關(guān)系運算符
Go 語言的關(guān)系運算符如圖,假設(shè)A值為10,B值為20。
3.邏輯運算符
Go 語言的邏輯運算符如圖。假定A值為True,B值為False。
4.位運算符
位運算符對整數(shù)在內(nèi)存中的二進制位進行操作。
位運算符比一般的算術(shù)運算符速度要快,而且可以實現(xiàn)一些算術(shù)運算符不能實現(xiàn)的功能。如果要開發(fā)高效率程序,位運算符是必不可少的。
Go 語言的位運算符如圖。假定 A = 60,B = 13,其二進制數(shù)轉(zhuǎn)換如下。
A = 0011 1100
B = 0000 1101
5.賦值運算符
Go 語言的賦值運算符如圖。
6.其他運算符
Go 語言的其他運算符如圖。
運算符的優(yōu)先級
所謂優(yōu)先級,就是當(dāng)多個運算符出現(xiàn)在同一個表達式中時,先執(zhí)行哪個運算符。