go 语言系列(二)基本数据类型和操作符
go 從入門(mén)到精通(二)基本數(shù)據(jù)類(lèi)型和操作符
一、文件名&關(guān)鍵字&標(biāo)識(shí)符
- 所有g(shù)o源碼都是以.go結(jié)尾
- 標(biāo)識(shí)符以字母或下劃線開(kāi)頭,大小寫(xiě)敏感
- 下劃線_是特殊標(biāo)識(shí)符,用戶忽略結(jié)果
- 保留關(guān)鍵字
- 導(dǎo)入包時(shí)可以設(shè)置別名
下面是保留關(guān)鍵字:
?
二、GO程序的基本結(jié)構(gòu)
package mainimport ("fmt" )func main(){fmt.Println("Hello world") }?
任何一個(gè)代碼必須隸屬一個(gè)包 import關(guān)鍵字,引入其他包 golang可執(zhí)行程序,package main 并且只有一個(gè)main入口函數(shù) 包中函數(shù)的調(diào)用,同一個(gè)函數(shù)中可以直接調(diào)用;不同包中函數(shù),通過(guò)包名+點(diǎn)+函數(shù)名進(jìn)行調(diào)用 包訪問(wèn)控制規(guī)則,大寫(xiě)意味著這個(gè)函數(shù)或者變量可以導(dǎo)出的,及在其他包內(nèi)是可以調(diào)用的;小寫(xiě)以為這個(gè)函數(shù)或者變量是私有的,包外部不能訪問(wèn)。?
小練習(xí)1
寫(xiě)一個(gè)小程序,對(duì)于給定的一個(gè)數(shù)字n,求出所有兩兩相加等于n的組合
小練習(xí)2
寫(xiě)一個(gè)小程序,包含兩個(gè)包,add和main,其中add包中有兩個(gè)變量:Name,和age,請(qǐng)問(wèn)main包中如何訪問(wèn)Name和age?(用于理解go中大小寫(xiě)敏感的問(wèn)題)
main包中的代碼:
package main import ("fmt""go_dev/day02/kexia02/add" )func main() {fmt.Println(add.Name) }add包中的代碼
package add var Name string = "zhaofan" var age int = 23從結(jié)果我們可以發(fā)現(xiàn)我們?cè)趍ain包中是不能調(diào)用到add包中的age,但是是可以調(diào)用到Name
這里就是因?yàn)榇笮?xiě)的問(wèn)題,go中的大寫(xiě)可以理解為其他語(yǔ)言中的public,小寫(xiě)理解為private
這里有個(gè)問(wèn)題需要注意:
我們把a(bǔ)dd包中的代碼改為:
這樣也是錯(cuò)誤的寫(xiě)法,go作為編譯型語(yǔ)言,必須通過(guò)函數(shù)來(lái)進(jìn)行語(yǔ)句的執(zhí)行,而不能在函數(shù)外執(zhí)行語(yǔ)句
小練習(xí)3
開(kāi)發(fā)一個(gè)小程序,使用包別名來(lái)訪問(wèn)包中的函數(shù)或變量
直接對(duì)上一個(gè)程序的main包進(jìn)行更改
小練習(xí)4
每個(gè)源文件都可以包含一個(gè)init函數(shù),這個(gè)init函數(shù)自動(dòng)被go運(yùn)行框架調(diào)用,通過(guò)下面例子演示:
運(yùn)行結(jié)果是先打印了init函數(shù)的內(nèi)容,后打印了main函數(shù)中的問(wèn)題,所以init函數(shù)先與main函數(shù)執(zhí)行
三、函數(shù)的聲明和注釋
函數(shù)聲明
格式為:func 函數(shù)名字(參數(shù)列表)(返回值列表)
例子如下:
func add(){
}
func add(a int,b int) int{
}
func add(a int,b int) (int int){
}
注釋
單行注釋//
多行注釋/* */
四、GO語(yǔ)言的數(shù)據(jù)類(lèi)型和操作符
常見(jiàn)數(shù)據(jù)類(lèi)型及分類(lèi)
GO語(yǔ)言按照類(lèi)別分為幾下幾種數(shù)據(jù)類(lèi)型:
布爾型:true或false,例子:var b bool = true
數(shù)字類(lèi)型:包括整型int和浮點(diǎn)float
字符串類(lèi)型:這里強(qiáng)調(diào)一下,GO的字符串是由單個(gè)字節(jié)連接起來(lái)的Go語(yǔ)言的字符串的字節(jié)使用UTF-8編碼標(biāo)識(shí)Unicode文本。
派生類(lèi)型:這里包括指針類(lèi)型,數(shù)組類(lèi)型,結(jié)構(gòu)化類(lèi)型,Channel類(lèi)型,函數(shù)類(lèi)型,接口類(lèi)型,Map類(lèi)型
注意:
字符串的時(shí)候用雙引號(hào)”“,這里也可以用反引號(hào)`,通過(guò)反引號(hào)的方式會(huì)保留你的格式,不會(huì)對(duì)你的內(nèi)容做任何轉(zhuǎn)義
字節(jié)的時(shí)候用單引號(hào)‘’,同樣也可以通過(guò)反引號(hào)`
var cc byte = 'c' fmt.println(ccc)
var cc byte =?c?fmt.println(cc)
一個(gè)會(huì)打印c的ASCII,一個(gè)會(huì)打印c
關(guān)于fmt.Printf()的用法
官網(wǎng)地址:https://go-zh.org/pkg/fmt/
?
練習(xí)1
使用math/rand生成隨機(jī)整數(shù),10個(gè)小于100的隨機(jī)整數(shù)以及10個(gè)隨機(jī)浮點(diǎn)數(shù)
package mainimport ("fmt""math/rand" )func rand_print(){for i:=0;i<10;i++{fmt.Println(rand.Int31n(100))fmt.Println(rand.Float32())}} func main() {rand_print() }但是這里會(huì)造成每次運(yùn)行程序生成的隨機(jī)數(shù)是相同的,解決方式是加入隨機(jī)種子:rand.Seed(time.Now().Unix())
五、常量
常用cost修飾,代表永遠(yuǎn)是只讀不能修改
const只能修飾boolean,number(int相關(guān)類(lèi)型,浮點(diǎn)類(lèi)型,complex)和string
語(yǔ)法
const 變量名 [變量類(lèi)型] = value其中變量類(lèi)型可以省略
例子
const b string = "hello"
const b int = 23
通常定義常亮的寫(xiě)法
const (
a = 0
b = 1
)
高級(jí)方法
const (
a = iota
b
c
)
這里自動(dòng)回吧a賦值為0,后面的變量一次加1
六、變量
聲明一個(gè)變量的形式是使用var關(guān)鍵字格式如下:
var 變量名 變量類(lèi)型
關(guān)于變量的聲明常用的有三種方法:
變量的作用域
在函數(shù)內(nèi)部聲明的變量叫做局部變量,生命周期僅限于函數(shù)內(nèi)部
在函數(shù)外部生命的變量叫做全局變量,生命周期作用域整個(gè)包,如果是大寫(xiě),作用域整個(gè)程序
在函數(shù)內(nèi)的語(yǔ)句塊的內(nèi)的變量只在語(yǔ)句塊,生命周期就是僅限于語(yǔ)句塊內(nèi).這里主要指{} 括起來(lái)的語(yǔ)句塊
通過(guò)下面的例子理解
例子1
結(jié)果會(huì)依次打印zhaofan,Jack,zhaofan
這里就是驗(yàn)證了函數(shù)內(nèi)部的定義的變量,生命周期僅限于函數(shù)內(nèi)部
如果我們把m函數(shù)中的a:="Jack"改為a = "Jack"
結(jié)果為:zhaofan,Jack,Jack
例子2
package mainimport ("fmt" ) var a stringfunc f1(){a := "Jack"fmt.Println(a)f2() } func f2(){fmt.Println(a) } func main(){a = "zhaofan"fmt.Println(a)f1() }這個(gè)程序的結(jié)果會(huì)打印zhaofan,Jack,zhaofan
其實(shí)這里還是要理解上面的說(shuō)的關(guān)于變量的作用域
值類(lèi)型和引用類(lèi)型
值類(lèi)型:變量直接存儲(chǔ)值,即變量直接指向存在內(nèi)存中的值。內(nèi)存通常在棧中分配
值類(lèi)型通常包括基本數(shù)據(jù)類(lèi)型int,float,bool,string以及數(shù)組和struct
var i int = 5
var j int = i
這個(gè)時(shí)候i和j的值都為5
其實(shí)這里內(nèi)存中是將i的值進(jìn)行了拷貝,我們通過(guò)&獲取變量的內(nèi)存地址也可以看出
&i和&j 的內(nèi)存地址是不同的,所以我如果在var j int = i,后繼續(xù)更改i變量的值,并不會(huì)影響j的值,因?yàn)槭遣煌膬?nèi)存地址存放的值
引用類(lèi)型:變量存的是一個(gè)地址,這個(gè)地址存儲(chǔ)最終的值,內(nèi)存通常在堆上分配。通過(guò)GC回收
一個(gè)引用類(lèi)型的變量 r1 存儲(chǔ)的是 r1 的值所在的內(nèi)存地址(數(shù)字),或內(nèi)存地址中第一個(gè)字所在的位置。
引用類(lèi)型通常包括指針,slice,map,chan等。
所以如果我們定義了兩個(gè)引用類(lèi)型變量像上面的值類(lèi)型一樣進(jìn)行賦值操作則兩者都會(huì)改變,因?yàn)閮烧叩囊玫刂肥窍嗤摹?/p>
所以在引用類(lèi)型中變量是拷貝的內(nèi)存地址,而地址最終指向值
小練習(xí)1
package mainimport ("fmt" )func main() {var a int = 100var b chan int = make(chan int,1)fmt.Println("a=",a)fmt.Println("b=",b) }結(jié)果為:
從這里我們也可以看出值類(lèi)型和引用類(lèi)型的區(qū)別
小練習(xí)2
寫(xiě)一個(gè)小程序,交換兩個(gè)整數(shù)的值
package mainimport ("fmt" )func swap(a int,b int){a,b = b,afmt.Println("a=",a,"b=",b) }func main() {change(5,4) }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/flying1819/articles/8832186.html
總結(jié)
以上是生活随笔為你收集整理的go 语言系列(二)基本数据类型和操作符的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wenbao与最优比率生成树
- 下一篇: 关于JAVA并发编程你需要知道的——硬件