隨着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數據,敬請期待!