go兩種數據類型的區別、數據類型和操作符、常量、變量聲明
值類型和引用類型
1、值類型:變量直接存儲值,內存通常在棧中分配。
基本數據類型int、float、bool、string以及數組和struct。
2、引用類型:變量存儲的是一個地址,這個地址存儲最終的值。內存通常在堆上分配。通過GC回收。
指針、slice(切片)、map、chan(管道)、interface等都是引用類型。
堆和棧的區別: 一、堆棧空間分配區別: 1、棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧; 2、堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。 二、堆棧緩存方式區別: 1、棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放,調用對象的速度較快;(棧空間) 2、堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(並不是一旦成為孤兒對象就能被回收)。
調用對象的速度要相對慢一些。(物理硬盤空間) 三、堆棧數據結構區別: 堆(數據結構):堆可以被看成是一棵樹,如:堆排序; 棧(數據結構):一種先進後出的數據結構。(函數的調用就是棧,先進後出)
值類型和引用類型實例:
實例一 實例二變量的作用域(全局區域只能聲明變量,不能執行語句,a:=1,這類語句編譯不能通過)
1、在函數內部聲明的變量叫做局部變量,生命周期僅限於函數內部。在{ }裏面的語句塊裏面的變量生命周期僅限於語句塊。
2、在函數外部聲明的變量叫做全局變量,生命周期作用於整個包,如果是大寫的,則作用於整個程序。
實例一 實例二 實例三
數據類型和操作符
1、bool類型,只能存true和false
2、相關操作符, !、&&、||
3、數字類型,主要有int、int8、int16、int32、int64、uint8(無符號整形)、uint16、uint32、uint64、float32、float64
4、類型轉換,type(variable),比如:var a int=8; var b int32=int32(a)
5、邏輯操作符: == 、!=、<、<=、>和 >=
6、數學操作符:+、-、*、/等等
7、字符類型:var a byte
var a byte = ‘c’
8、字符串類型: var str string
9、字符串表示兩種方式: 1)" "雙引號 2)`` 反引號
所有整數初始化為0,所有浮點數初始化為0.0,所有布爾類型初始化為False
View Code10、位操作符
a.與操作:& 1&1 =1 1&0 = 0 0&1 =0 0&0 = 0
b.或操作:| 1|1 = 1 1&0 = 1 0&1 =1 0&0 = 0
d.異或操作:^ 1|1 = 0 1&0 = 1 0&1 =1 0&0 = 0
左移<< 1<<10=1024
右移>> 1024>>10=1
位操作符實例
常量
1.常量使用const 修飾,代表永遠是只讀的,不能修改。
2.const 只能修飾boolean,number(int相關類型、浮點類型、complex)和string。
3.語法:const identifier [type] = value,其中type可以省略。
const b string = “hello world”
const b = “hello world”
const Pi = 3.1414926
const a = 9/3
預定義常量:
比較優雅的寫法:
const (
a = 0
b = 1
c = 2
)
更加專業的寫法:
const (
a = iota //a=0,後面的變量都在前面的基礎上都加1
b //1
c //2
)
變量
1、語法:var identifier type
var v1 int
var v2 string
var v3 [10]int //數組
var v4 []int //數組切片
var v5 struct{
f int
}
var v6 *int //指針
var v7 map[string] int
var v8 func(a int) //指針
第二種寫法:
var (
v1 int //默認為0
v2 string //默認為""
v3 [10]int //數組
v4 []int //數組切片
v5 struct{
f int
}
v6 *int //指針
v7 map[string] int
v8 func(a int) //指針
v9 bool //默認為false
)
變量的初始化操作:
var v1 int = 10
var v2 = 10
v3 := 10 //不能用於全局變量的聲明
go兩種數據類型的區別、數據類型和操作符、常量、變量聲明