Go 基礎(chǔ)

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è)不定參
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 運(yùn)算符 算數(shù)運(yùn)算符 關(guān)系運(yùn)算符 邏輯運(yùn)算符 位運(yùn)算符 賦值運(yùn)算符 其他運(yùn)算符ps:為防止發(fā)生混淆,go語(yǔ)法規(guī)定,+...
    名字剛好七個(gè)字閱讀 465評(píng)論 1 0
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評(píng)論 0 38
  • 安裝和環(huán)境配置 自行百度解決 go項(xiàng)目的目錄結(jié)構(gòu) go命令依賴一個(gè)重要的環(huán)境變量:$GOPATH一般的,一個(gè)Go項(xiàng)...
    名字剛好七個(gè)字閱讀 422評(píng)論 0 0
  • Go基礎(chǔ) Go與c對(duì)比 Go中的注釋與C的注釋一樣,有多行和單行,細(xì)節(jié)都一樣 都是由函數(shù)組成的 入口函數(shù)都是mai...
    無尾樹袋熊閱讀 493評(píng)論 0 0
  • 運(yùn)行 hello world 報(bào)錯(cuò) go run test.go go run: cannot run non-m...
    Edmond_33閱讀 792評(píng)論 0 0

友情鏈接更多精彩內(nèi)容