Go 基礎(chǔ)

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粱坤、不能將不定參傳遞給另一個不定參
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隶糕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子站玄,更是在濱河造成了極大的恐慌枚驻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件株旷,死亡現(xiàn)場離奇詭異再登,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門锉矢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梯嗽,“玉大人,你說我怎么就攤上這事沽损〉平冢” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵缠俺,是天一觀的道長显晶。 經(jīng)常有香客問我,道長壹士,這世上最難降的妖魔是什么磷雇? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮躏救,結(jié)果婚禮上唯笙,老公的妹妹穿的比我還像新娘。我一直安慰自己盒使,他們只是感情好崩掘,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著少办,像睡著了一般苞慢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上英妓,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天挽放,我揣著相機與錄音,去河邊找鬼蔓纠。 笑死辑畦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的腿倚。 我是一名探鬼主播纯出,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敷燎!你這毒婦竟也來了暂筝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤懈叹,失蹤者是張志新(化名)和其女友劉穎乖杠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澄成,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了墨状。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卫漫。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肾砂,靈堂內(nèi)的尸體忽然破棺而出列赎,到底是詐尸還是另有隱情,我是刑警寧澤镐确,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布包吝,位于F島的核電站,受9級特大地震影響源葫,放射性物質(zhì)發(fā)生泄漏诗越。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一息堂、第九天 我趴在偏房一處隱蔽的房頂上張望嚷狞。 院中可真熱鬧,春花似錦荣堰、人聲如沸床未。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薇搁。三九已至,卻和暖如春渡八,著一層夾襖步出監(jiān)牢的瞬間啃洋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工呀狼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裂允,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓哥艇,卻偏偏與公主長得像绝编,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子貌踏,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

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