一,變量和常量
1,變量的聲明
聲明格式: var 變量名 變量類型
var name string
name = "小明"
fmt.Println(name)
批量聲明:
var age,height int8 //變量類型相同
age = 18
height = 170 //constant 170 overflows int8
var ( //類型變量不同
a string
b int
c bool
d float32
)
聲明并賦值:
hobby := "打籃球"
程序自動判斷:
var teacher = "李小龍"
var name,age = "小李" , 18
注意事項:
- 變量聲明的時候會在變量對應(yīng)的內(nèi)存區(qū)域進(jìn)行初始化操作,每個變量會生成該變量所屬類型的一個初始默認(rèn)值,例如:整形和浮點型:0;字符串:空字符串;布爾類型默認(rèn)值為:false;切片,函數(shù),指針變量默認(rèn)為nil
- 變量聲明之后要使用,如果不使用則會報錯
- 字符串可用雙引號 " " ,或者 反引號 ` ` 表示,不可以用單引號。但是反引號不支持轉(zhuǎn)義(例如\n轉(zhuǎn)義為換行),而是直接輸出 \n
- 在函數(shù)的外部,聲明變量必須用 var 關(guān)鍵字,而不能用
:=的方法聲明
2,匿名變量(anonymous variable)
- 匿名變量不占用命名空間,不分配內(nèi)存,所有匿名變量不存在重復(fù)聲明
- 我們常用匿名變量,表示要忽略掉(不使用)該變量
- 我們只執(zhí)行包的初始化,但是不使用包,也應(yīng)用到匿名變量
func foo() (int, string) {
return 10, "Q1mi"
}
func main() {
x, _ := foo()
_, y := foo()
fmt.Println("x=", x)
fmt.Println("y=", y)
}
3,常量
常量定義之后,在整個程序的運行中,都保持不變。常量的定義與變量類似,只是把 var 關(guān)鍵字換成 const 關(guān)鍵字 就可以了
const pi = 3.1415
const e = 2.7182
二,打印輸出
golang的打印輸出依賴:fmt包 import ("fmt" )
- fmt.Println() 打印并換行
- fmt.Printf() 格式化輸出
- 查看變量類型用reflect.TypeOf()
type Cat struct{
length int8
color string
skill string
}
kitty := Cat{
length : 5,
color : "orange",
skill : "catch mouse",
}
fmt.Println(kitty) // {5 orange catch mouse}
fmt.Printf("kitty是:%v \n",kitty) // %v是默認(rèn)的占位符:kitty是:{5 orange catch mouse}
fmt.Printf("kitty是:%+v \n",kitty) // %+v會打印鍵值對: kitty是:{length:5 color:orange skill:catch mouse}
fmt.Printf("kitty是:%#v \n",kitty) // %#v會打印類型+鍵值對: kitty是:main.Cat{length:5, color:"orange", skill:"catch mouse"}
var teacher = "李小龍"
fmt.Println(reflect.TypeOf(teacher)) // string 查看變量類型
fmt.Println(reflect.TypeOf(kitty)) //查看變量類型:main.Cat
參考文章:https://studygolang.com/articles/20310
1,通用占位符:
v 值的默認(rèn)格式。
%s 輸出字符串表示(string類型或[]byte)
%+v 添加字段名(如結(jié)構(gòu)體)
%% 字面上的百分號,并非值的占位符
2,整數(shù)占位符:
%b 二進(jìn)制表示
%d 十進(jìn)制表示
%x 十六進(jìn)制表示
3,浮點數(shù)及復(fù)數(shù):
%b 無小數(shù)部分的,指數(shù)為二的冪的科學(xué)計數(shù)法,與 strconv.FormatFloat中的 'b' 轉(zhuǎn)換格式一致。例如 -123456p-78
%f 有小數(shù)點而無指數(shù),例如 123.456
4,指針:
%p 十六進(jìn)制表示,前綴 0x
fmt.Printf("%p \n",&kitty) // 0xc000070330
三,命令行
- 在命令行執(zhí)行:
go會列出所有命令 - 在命令號執(zhí)行:
go help + 命令可以獲得幫助
常用命令有:
go version 查看版本
go env用于打印Go語言的環(huán)境信息。
go run命令可以編譯并運行命令源碼文件。
go get可以根據(jù)要求和實際情況從互聯(lián)網(wǎng)上下載或更新指定的代碼包及其依賴包,并對它們進(jìn)行編譯和安裝。
go build命令用于編譯我們指定的源碼文件或代碼包以及它們的依賴包。
go install用于編譯并安裝指定的代碼包及它們的依賴包。
go clean命令會刪除掉執(zhí)行其它命令時產(chǎn)生的一些文件和目錄。
go doc命令可以打印附于Go語言程序?qū)嶓w上的文檔。我們可以通過把程序?qū)嶓w的標(biāo)識符作為該命令的參數(shù)來達(dá)到查看其文檔的目的。
go test命令用于對Go語言編寫的程序進(jìn)行測試。
go list命令的作用是列出指定的代碼包的信息。
go fix會把指定代碼包的所有Go語言源碼文件中的舊版本代碼修正為新版本的代碼。
go vet是一個用于檢查Go語言源碼中靜態(tài)錯誤的簡單工具。
go tool pprof命令來交互式的訪問概要文件的內(nèi)容。
三,變量的復(fù)制,引用,指針變量
&符號在go中是取內(nèi)存地址的意思, &a就是獲取變量a的內(nèi)存地址
1,變量的賦值是值傳遞
var age int8 = 18
fmt.Println(age) // 18
fmt.Println(&age) // 0xc0000120a0
var age1 int8 = age
fmt.Println(age1) // 18
fmt.Println(&age1) // 0xc0000120b6 可以發(fā)現(xiàn)age與age1的地址空間并不相同
2,指針
var age int = 18
fmt.Println(&age) // 0xc0000120a0
var agePoint *int //解析:agePoint 是一個指針變量,int是指該指針變量的類型,*表示該變量(agePoint)是一個指針變量
fmt.Println(agePoint) // nil,當(dāng)一個指針被定義后沒有分配到任何變量時,它的值為 nil。
//*agePoint = 1 //報錯,原因:我們定義一個指針(agePoint),指針分配了地址(指針地址),但是指針指向的值(*agePoint)還沒有分配到地址
//fmt.Println(*agePoint) //報錯,原因:與上相同,只分配了指針地址,還沒分配 值 地址
agePoint = &age
fmt.Println(*agePoint) // 18
fmt.Println(agePoint) // 0xc0000120a0 可見,與age變量的內(nèi)存地址是一樣的
*agePoint = 29
fmt.Println(age) // 29 可見,改變 *agePoint,age也會一同改變
上面代碼中:
- var age 是一個int類型的值,而 var agePoint 是一個指針
- *agePoint 是一個值
- 用
&可以取到某個變量的內(nèi)存地址,這個內(nèi)存地址可以賦值給一個指針變量 - 改變 *agePoint,age也會一同改變,因為這兩個變量的值,存放在:相同的內(nèi)存地址
3,接收指針的函數(shù)
func main() {
var myAge int8 = 18
var yourAge int8 = 28
changeEachOther(&myAge,&yourAge)
fmt.Println(myAge) // 28
fmt.Println(yourAge) // 18
}
//交換兩個變量的值
func changeEachOther(x *int8,y *int8) {
fmt.Println(x) // x是一個內(nèi)存地址,0xc0000120a0,其實 x 就是 &myAge
fmt.Println(*x) // *x是&myAge內(nèi)存地址里面的值,18
var temp int8 = *x
*x = *y
*y = temp
}
4,傳值與傳引用
- 參考博文:https://blog.csdn.net/cyk2396/article/details/78893828
-
var b = a如果b的修改不會改變a的值,那么是傳值;否則,是傳引用
四,內(nèi)置類型和函數(shù):
1,內(nèi)置類型--值類型:
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array -- 固定長度的數(shù)組
2,引用類型(指針類型)
slice -- 序列數(shù)組(最常用)
map -- 映射
chan -- 管道
3,內(nèi)置函數(shù)
Go 語言擁有一些不需要進(jìn)行導(dǎo)入操作就可以使用的內(nèi)置函數(shù)。它們有時可以針對不同的類型進(jìn)行操作,例如:len、cap 和 append,或必須用于系統(tǒng)級的操作,例如:panic。因此,它們需要直接獲得編譯器的支持。
append -- 用來追加元素到數(shù)組、slice中,返回修改后的數(shù)組、slice
close -- 主要用來關(guān)閉channel
delete -- 從map中刪除key對應(yīng)的value
panic -- 停止常規(guī)的goroutine (panic和recover:用來做錯誤處理)
recover -- 允許程序定義goroutine的panic動作
real -- 返回complex的實部 (complex、real imag:用于創(chuàng)建和操作復(fù)數(shù))
imag -- 返回complex的虛部
make -- 用來分配內(nèi)存,返回Type本身(只能應(yīng)用于slice, map, channel)
new -- 用來分配內(nèi)存,主要用來分配值類型,比如int、struct。返回指向Type的指針
cap -- capacity是容量的意思,用于返回某個類型的最大容量(只能用于切片和 map)
copy -- 用于復(fù)制和連接slice,返回復(fù)制的數(shù)目
len -- 來求長度,比如string、array、slice、map、channel ,返回長度
print、println -- 底層打印函數(shù),在部署環(huán)境中建議使用 fmt 包