GO從入門到進階教程系列 - 研發高性能ORM框架入門篇

        隨着GO語言市場佔比越來越高,我也開始轉向使用GO開發項目;因爲GO有好幾大優點,比如容併發與協程,消息通訊,豐富的數據類型,函數多返回值,defer延遲處理機制,高性能易用的http服務,編程規範等等;也存在一些弱點,由於自身語言機制問題,導致GO不能像JAVA一樣使用異常捕獲機制,以及本身GO的異常處理機制讓開發者倍感彆扭;

技術版權歸屬 廣州市金獅網絡科技有限公司 (https://kingc.cn/) ,如需商用請聯繫公司

基本介紹已經完畢我們開始進入開發主題,開發一個我們常用的高性能ORM框架,首先我們先熟悉下GO的語法

1. 基礎的hello world

package main

import "fmt"

func main() {
   /* 這是我的第一個簡單的程序 */
   fmt.Println("Hello, World!")
}

2. 基礎的變量聲明和函數聲明

package main

import "fmt"

func main() {
  _,numb,strs := numbers() //只獲取函數返回值的後兩個
  fmt.Println(numb,strs)
}

//一個可以返回多個值的函數
func numbers()(int,int,string){
  a , b , c := 1 , 2 , "str"
  return a,b,c
}

3. 基礎常用的數組聲明

package main

import "fmt"

func main() {
   var n [10]int /* n 是一個長度爲 10 的數組 */
   var i,j int

   /* 爲數組 n 初始化元素 */         
   for i = 0; i < 10; i++ {
      n[i] = i + 100 /* 設置元素爲 i + 100 */
   }

   /* 輸出每個數組元素的值 */
   for j = 0; j < 10; j++ {
      fmt.Printf("Element[%d] = %d\n", j, n[j] )
   }
}

4. 基礎指針聲明(類似C語言指針,必會)

package main

import "fmt"

func main() {
   var a int= 20   /* 聲明實際變量 */
   var ip *int        /* 聲明指針變量 */

   ip = &a  /* 指針變量的存儲地址 */

   fmt.Printf("a 變量的地址是: %x\n", &a  )

   /* 指針變量的存儲地址 */
   fmt.Printf("ip 變量儲存的指針地址: %x\n", ip )

   /* 使用指針訪問值 */
   fmt.Printf("*ip 變量的值: %d\n", *ip )
}

5. 基礎結構體聲明(類似JAVA的實體,必會)

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}


func main() {

    // 創建一個新的結構體
    fmt.Println(Books{"Go 語言", "kingc.cn", "Go 語言教程", 6495407})

    // 也可以使用 key => value 格式
    fmt.Println(Books{title: "Go 語言", author: "kingc.cn", subject: "Go 語言教程", book_id: 6495407})

    // 忽略的字段爲 0 或 空
   fmt.Println(Books{title: "Go 語言", author: "kingc.cn"})
}

6. 常用的map集合聲明

package main

import "fmt"

func main() {
    var countryCapitalMap map[string]string /*創建集合 */
    countryCapitalMap = make(map[string]string)

    /* map插入key - value對,各個國家對應的首都 */
    countryCapitalMap [ "France" ] = "Paris"
    countryCapitalMap [ "Italy" ] = "羅馬"
    countryCapitalMap [ "Japan" ] = "東京"
    countryCapitalMap [ "India " ] = "新德里"

    /*使用鍵輸出地圖值 */ for country := range countryCapitalMap {
        fmt.Println(country, "首都是", countryCapitalMap [country])
    }

    /*查看元素在集合中是否存在 */
    captial, ok := countryCapitalMap [ "美國" ] /*如果確定是真實的,則存在,否則不存在 */
    /*fmt.Println(captial) */
    /*fmt.Println(ok) */
    if (ok) {
        fmt.Println("美國的首都是", captial)
    } else {
        fmt.Println("美國的首都不存在")
    }
}

7. 接口與實現類聲明(類似JAVA接口實現類,必會)

package main

import (
    "fmt"
)

type Phone interface {
    call()
}

type NokiaPhone struct {
}

func (nokiaPhone NokiaPhone) call() {
    fmt.Println("I am Nokia, I can call you!")
}

type IPhone struct {
}

func (iPhone IPhone) call() {
    fmt.Println("I am iPhone, I can call you!")
}

func main() {
    var phone Phone

    phone = new(NokiaPhone)
    phone.call()

    phone = new(IPhone)
    phone.call()

}

8. 錯誤異常聲明(異常機制,必會)

package main

import (
    "fmt"
)

// 定義一個 DivideError 結構
type DivideError struct {
    dividee int
    divider int
}

// 實現 `error` 接口
func (de *DivideError) Error() string {
    strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`
    return fmt.Sprintf(strFormat, de.dividee)
}

// 定義 `int` 類型除法運算的函數
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
    if varDivider == 0 {
        dData := DivideError{
            dividee: varDividee,
            divider: varDivider,
        }
        errorMsg = dData.Error()
        return
    } else {
        return varDividee / varDivider, ""
    }

}

func main() {

    // 正常情況
    if result, errorMsg := Divide(100, 10); errorMsg == "" {
        fmt.Println("100/10 = ", result)
    }
    // 當被除數爲零的時候會返回錯誤信息
    if _, errorMsg := Divide(100, 0); errorMsg != "" {
        fmt.Println("errorMsg is: ", errorMsg)
    }

}

9. 基礎併發與通道使用示例(多線程併發與通道,必會)

package main

import "fmt"

func sum(s []int, c chan int) {
        sum := 0
        for _, v := range s {
                sum += v
        }
        c <- sum // 把 sum 發送到通道 c
}

func main() {
        s := []int{7, 2, 8, -9, 4, 0}

        c := make(chan int)
        go sum(s[:len(s)/2], c)
        go sum(s[len(s)/2:], c)
        x, y := <-c, <-c // 從通道 c 中接收

        fmt.Println(x, y, x+y)
}

上面的幾個示例基本涵蓋GO入門所需的語法與特性,下一篇文章我會講解如何實際通過對象獲取mysql數據,敬請期待!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章