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