Go 簡(jiǎn)介
- 1、2007年,由 Google 公司的軟件工程師創(chuàng)造,準(zhǔn)備用來取代 C++,并于2009年正式對(duì)外發(fā)布。
- 2、Go 語(yǔ)言語(yǔ)法相對(duì)簡(jiǎn)單,比較容易上手;
- 3、Go擁有接近C的運(yùn)行效率和接近PHP的開發(fā)效率。
- 4、Go 是一種非常高效的語(yǔ)言,高度支持并發(fā)性。
- 5、擁有 GC (垃圾收集器)的機(jī)制,對(duì)變量進(jìn)行跟蹤,并且在不需要時(shí)自動(dòng)釋放他們;
- 6、為多核計(jì)算機(jī)提供性能提升方案;
- 7、UTF-8編碼支持;
基本語(yǔ)法
// 當(dāng)前程序的包名
// 只有 package 名稱為 main 的包可以包含 main 函數(shù)
// 一個(gè)可執(zhí)行的程序有且只有一個(gè) main 包
package main
// 導(dǎo)入其他包
import "fmt"
import "container/list"
// 定義常量
const PI = 3.14
// 定義全局變量
var num int = 4
// 定義方法
func test() {
// 簡(jiǎn)略寫法,此種方法只能寫在方體里面
tmp := "test" + "123"
fmt.Println(tmp)
}
// 指針的使用
func test_ptr() {
tmp := "yangzw"
// 獲取變量取地址后的指針值
fmt.Println(&tmp)
// 通過指針取值
// 取地址操作符 & 和取值操作符 * 是一對(duì)互補(bǔ)操作符,& 取出地址,* 根據(jù)地址取出地址指向的值。
ptr := &tmp
fmt.Println(*ptr)
// swap 方法只交換 a、b 變量的地址,但是指針和值的關(guān)聯(lián)并沒有交換,一次結(jié)果不會(huì)交換兩個(gè)變量
// 使用 swap_tmp 方法才可以交換兩值
// 就像兩張寫有不同名字的紙片,交換紙片后對(duì)應(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ù)組或切片生成新的切片擁有如下特性:
// 取出的元素?cái)?shù)量為:結(jié)束位置-開始位置。
// 取出元素不包含結(jié)束位置對(duì)應(yīng)的索引,切片最后一個(gè)元素使用 slice[len(slice)] 獲取。
// 當(dāng)缺省開始位置時(shí),表示從連續(xù)區(qū)域開頭到結(jié)束位置。
// 當(dāng)缺省結(jié)束位置時(shí),表示從開始位置到整個(gè)連續(xù)區(qū)域末尾。
// 兩者同時(shí)缺省時(shí),與切片本身等效。
// 兩者同時(shí)為0時(shí),等效于空切片,一般用于切片復(fù)位
// 使用 make 函數(shù)構(gòu)造切片
// 10 代表分配空間,并不會(huì)影響長(zhǎng)度
b := make([]int, 2, 10)
fmt.Println(b)
// 輸出結(jié)構(gòu):[0 0]
// 向切片中添加元素
var slice []int
slice.append(slice, 7, 8)
fmt.Println(slice)
// 復(fù)制切片 copy(slice1, slice2) 將 slice2 中元素復(fù)制到 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() 表示初始賦值,只會(huì)在一開始執(zhí)行一次;每次循環(huán)會(huì)進(jìn)行一次 i!=nil 語(yǔ)句判斷,如果返回 false,表示退出循環(huán),反之則會(huì)執(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
}
// 多個(gè)返回值函數(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)
}
}
// 當(dāng)無法取人傳入?yún)?shù)類型時(shí),可以使用默認(rèn)的空接口 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ù)當(dāng)作一個(gè)參數(shù)進(jìn)行傳遞
*/
// 聲明一個(gè)函數(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)體知識(shí)一種內(nèi)存布局描述,只有實(shí)例化后才會(huì)正式分配內(nèi)存
// 定義一個(gè)結(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() {
// 實(shí)例化結(jié)構(gòu)體方式
// 1、普通初始化
var an animal
// 2、通過 new 實(shí)例化結(jié)構(gòu)體 此時(shí)形成的是指針類型的結(jié)構(gòu)體
b := new(animal)
// 初始化結(jié)構(gòu)體變量
c := &animal {
name: "dog",
age: 12,
}
d := animal {
"dog",
12,
}
b.setName("dd")
}
注意事項(xiàng)
- 1、變量聲明必須使用,同一個(gè) {} 內(nèi)聲明的變量是唯一的;
- 2、數(shù)據(jù)交換
i, j := 1,2
i,j = j, i
- 3、單引號(hào)表示字符,雙引號(hào)表示字符串
- 4、接收鍵盤收入
var a int
fmt.Scan(&a)
- 5、類型轉(zhuǎn)換只能在相互兼容的類型間進(jìn)行轉(zhuǎn)換
- 6、不能將不定參傳遞給另一個(gè)不定參