Go 簡介
- 1琴许、2007年,由 Google 公司的軟件工程師創(chuàng)造溉躲,準備用來取代 C++榜田,并于2009年正式對外發(fā)布。
- 2锻梳、Go 語言語法相對簡單箭券,比較容易上手;
- 3疑枯、Go擁有接近C的運行效率和接近PHP的開發(fā)效率辩块。
- 4、Go 是一種非常高效的語言荆永,高度支持并發(fā)性废亭。
- 5、擁有 GC (垃圾收集器)的機制具钥,對變量進行跟蹤豆村,并且在不需要時自動釋放他們;
- 6骂删、為多核計算機提供性能提升方案掌动;
- 7、UTF-8編碼支持宁玫;
基本語法
// 當前程序的包名
// 只有 package 名稱為 main 的包可以包含 main 函數(shù)
// 一個可執(zhí)行的程序有且只有一個 main 包
package main
// 導入其他包
import "fmt"
import "container/list"
// 定義常量
const PI = 3.14
// 定義全局變量
var num int = 4
// 定義方法
func test() {
// 簡略寫法粗恢,此種方法只能寫在方體里面
tmp := "test" + "123"
fmt.Println(tmp)
}
// 指針的使用
func test_ptr() {
tmp := "yangzw"
// 獲取變量取地址后的指針值
fmt.Println(&tmp)
// 通過指針取值
// 取地址操作符 & 和取值操作符 * 是一對互補操作符,& 取出地址撬统,* 根據(jù)地址取出地址指向的值适滓。
ptr := &tmp
fmt.Println(*ptr)
// swap 方法只交換 a、b 變量的地址恋追,但是指針和值的關(guān)聯(lián)并沒有交換,一次結(jié)果不會交換兩個變量
// 使用 swap_tmp 方法才可以交換兩值
// 就像兩張寫有不同名字的紙片罚屋,交換紙片后對應(yīng)的名字是不變的
x, y := 1, 2
swap(&x, &y)
fmt.Println(x, y)
// 輸出結(jié)果:1 2
}
func swap(a, b *int) {
b, a = a, b
}
func swap_tmp(a, b *int) {
t := *a
*a = *b
*b = t
}
func main() {
test()
test_ptr()
/*
* 榮天氣的使用
*/
// 1苦囱、數(shù)組使用
var a [8]int = [8]int{1, 2, 3, 4, 5, 6}
for i, v := range a {
fmt.Println(i, v)
}
// 2、切片使用
fmt.Println(a, a[1:2])
// 輸出結(jié)果:[1 2 3] [2]
fmt.Println(a, a[:2])
fmt.Println(a, a[4:])
fmt.Println(a, a[:]) // 原有切片
fmt.Println(a, a[0:0]) // 清空切片
// 從數(shù)組或切片生成新的切片擁有如下特性:
// 取出的元素數(shù)量為:結(jié)束位置-開始位置脾猛。
// 取出元素不包含結(jié)束位置對應(yīng)的索引撕彤,切片最后一個元素使用 slice[len(slice)] 獲取。
// 當缺省開始位置時,表示從連續(xù)區(qū)域開頭到結(jié)束位置羹铅。
// 當缺省結(jié)束位置時蚀狰,表示從開始位置到整個連續(xù)區(qū)域末尾。
// 兩者同時缺省時职员,與切片本身等效麻蹋。
// 兩者同時為0時,等效于空切片焊切,一般用于切片復位
// 使用 make 函數(shù)構(gòu)造切片
// 10 代表分配空間扮授,并不會影響長度
b := make([]int, 2, 10)
fmt.Println(b)
// 輸出結(jié)構(gòu):[0 0]
// 向切片中添加元素
var slice []int
slice.append(slice, 7, 8)
fmt.Println(slice)
// 復制切片 copy(slice1, slice2) 將 slice2 中元素復制到 slice1 中
// 3、map 使用
var map1 = map[string]int{"one": 1, "two": 2}
map2 := make(map[string]int)
map2["three"] = 3
delete(map1, "one") // 刪除 map 中的元素
// 4专肪、列表使用
l1 := list.New()
// var l2 list.list
tmp := l1.PushBack("fist") // 尾部添加元素
l1.PushFront(67) // 頭部添加元素
l1.InsertAfter("high", tmp) // 在 first 后插入 high
l1.InsertBefore("noon", tmp)
l1.Remove(tmp) // 移除元素
// 遍歷獲取 list 元素
// 其中 i:=l.Front() 表示初始賦值刹勃,只會在一開始執(zhí)行一次;每次循環(huán)會進行一次 i!=nil 語句判斷嚎尤,如果返回 false荔仁,表示退出循環(huán),反之則會執(zhí)行 i=i.Next()
for i := l1.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}
}
函數(shù)使用
- 1芽死、基本使用
// 普通函數(shù)
func demo1() {
fmt.Println("普通函數(shù)")
}
// 帶參數(shù)函數(shù)
func demo2(i int, str string) {
fmt.Println(i, str)
}
// 帶參數(shù)和返回值函數(shù)
func demo3(i, j int) int {
return i + j
}
// 多個返回值函數(shù)
func demo4(i, j int) (int, int) {
return i, j
}
- 2咕晋、函數(shù)類型
// 可變參數(shù)類型
func demo1(str string, nums ...int) {
for _, val := range nums {
fmt.Println(str, val)
}
}
// 當無法取人傳入?yún)?shù)類型時,可以使用默認的空接口 interface{},這樣就可以接收任意類型的參數(shù)
func demo2(value ...interface{}) {
for _, val := range value {
switch val.(type) {
case int:
fmt.Println("int")
case string:
fmt.Println("string")
case bool:
fmt.Println("bool")
default:
fmt.Println("unknow")
}
}
}
/*
* 將函數(shù)當作一個參數(shù)進行傳遞
*/
// 聲明一個函數(shù)類型
type demo3 func(int) bool
func demo4(i int) bool {
if i % 2 == 0 {
return true
}
return false
}
func demo5(nums []int, f demo3) {
for _, num := range nums {
if f(num) {
fmt.Println(num, "是偶數(shù)")
} else {
fmt.Println(num, "是奇數(shù)")
}
}
}
結(jié)構(gòu)體
結(jié)構(gòu)體知識一種內(nèi)存布局描述芹关,只有實例化后才會正式分配內(nèi)存
// 定義一個結(jié)構(gòu)體
type animal struct {
name string
age int
}
// 添加結(jié)構(gòu)體方法
func (a *animal) setName(name string) {
a.name = name
}
type Cat struct {
Color string
Name string
}
func NewCatByName(name string) *Cat {
return &Cat{
Name: name,
}
}
func main() {
// 實例化結(jié)構(gòu)體方式
// 1锋谐、普通初始化
var an animal
// 2、通過 new 實例化結(jié)構(gòu)體 此時形成的是指針類型的結(jié)構(gòu)體
b := new(animal)
// 初始化結(jié)構(gòu)體變量
c := &animal {
name: "dog",
age: 12,
}
d := animal {
"dog",
12,
}
b.setName("dd")
}
注意事項
- 1质蕉、變量聲明必須使用,同一個 {} 內(nèi)聲明的變量是唯一的翩肌;
- 2模暗、數(shù)據(jù)交換
i, j := 1,2
i,j = j, i
- 3、單引號表示字符念祭,雙引號表示字符串
- 4兑宇、接收鍵盤收入
var a int
fmt.Scan(&a)
- 5、類型轉(zhuǎn)換只能在相互兼容的類型間進行轉(zhuǎn)換
- 6粱坤、不能將不定參傳遞給另一個不定參