GO語言入門

GO語言概述

什麼是GO語言

  • Go(又稱Golang)是Google開發的一種靜態強類型、編譯型、併發型,並具有垃圾回收功能的編程語言

GO語言特性

  • 語法接近C,但對於變量的聲明有所不同
  • 支持垃圾回收功能
  • 不包括:枚舉、異常處理、繼承、泛型、斷言、虛函數等功能
  • 增加了切片(Slice)型、併發、管道、垃圾回收、接口(Interface)等特性的語言級支持

GO三大紀律

  • 每行程序結束後不需要撰寫分號(;)
  • 大括號({)不能夠換行放置
  • if判斷式和for循環不需要以小括號包裹起來

GO語言體系結構(GOPATH目錄下各文件夾用途)

  • src存放源代碼
  • pkg存放編譯後生成的文件
  • bin存放編譯後生成的可執行文件

GO語言開發基礎

GO數據類型

  • 布爾型
  • 數值型
  • 字符串型
    Go的字符串是由單個字節連接起來的,字符串的字節使用UTF-8編碼標識Unicode文本
  • 派生類型
    數組類型、切片類型、Map類型
    指針類型(Pointer)、結構化類型(struct)、Channel類型
    函數類型、接口類型(interface)

GO變量聲明

  • 指定變量類型,如果沒有初始化,則變量默認爲零值
  • 類型在後面
  • 不加分號
  • 變量聲明後必須使用,不然報錯,go變量拒絕浪費(常量不使用不會報錯)
  • 佔位符,使用下劃線 _ 定義

常量

  • iota 特殊常量,可以認爲是一個可以被編譯器修改的常量
  • 常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和複數)和字符串型
  • 常量定義使用const關鍵字

方法

  • 方法如果被外部類調用,首字母要大寫
    var v name v type 
	var a int
	var b, c float32
	var d bool
	var e = "Shanghai"
	ff := 1234

for循環

(go語言只有for循環,沒有while沒有do while)

	//無線循環for
	for{
	    // 無限循環執行部分
	}

	//普通for
	for i:=0;i<5;i++ {
		fmt.Print(i)
	}

	//相當於while的for
	i := 0
	for i<5 {
		fmt.Println(i)
		i++
	}

GO語言字符串

strings包

	str2 := strings.ToUpper(str1)
	fmt.Println(str2)

strconv包

	a := 100

	str1 := strconv.Itoa(a)
	fmt.Println(str1)

	fmt.Println(reflect.TypeOf(str1))
	fmt.Println(reflect.TypeOf(a))

接口interface

  • 接口interface是個萬能類型,不只用於接口
  • 可以定義一個通用的模型,如汽車接口,可以實現爲寶馬、奧迪

結構體

  • 結構體使用struct和type定義
  • 結構體名字首字母大寫

go語言切片

  • go語言切片是對數組的抽象
  • append和copy,增加slice容量

go語言異常處理

  • defer
  • panic
  • recover

go通道

  • 通道(channel)是用來傳遞數據的一個數據結構
  • 通道用於兩個goroutine之間通過傳遞一個指定類型的值來同步運行和通訊
  • 操作符<-用於指定通道方向發送或接收
  • 如果未指定方向,則爲雙向通道

go 併發

  • go語言支持併發需要通過go關鍵字來開啓goroutine
  • goroutine是輕量級線程,調度由Golang運行時進行管理

GO語言示例

示例1:方法加go後執行順序不固定,體現出併發的效果

package main

import (
	"fmt"
	"time"
)

func Hello(){
	fmt.Println("Hello")
}

func DelayP(){
	for i:=0;i<5;i++ {
		fmt.Println(i)
		time.Sleep(time.Microsecond)
	}
}

func main() {
	go Hello()
	//Hello()
	//DelayP()
	go DelayP()
	time.Sleep(6 * time.Second)
	fmt.Println("End of program!")
}

示例2:

package main

import (
	"fmt"
	"time"
)

var echo chan string
var receive chan string

func Echo(){
	time.Sleep(time.Second * 2)
	echo <- "Arthur Beyond"
}

func Receive() {
	time.Sleep(time.Second * 2)
	temp := <- echo
	receive <- temp
}

func main() {
	echo = make(chan string)
	receive = make(chan string)

	go Echo()
	go Receive()

	getStr := <- receive
	fmt.Println("in main function")
	fmt.Println(getStr)
}

示例3:

package main

import (
	"fmt"
	"os"
	"os/signal"
	"sync"
	"syscall"
	"time"
)
func consumer(stop <-chan bool) {
	for {
		select {
		case <-stop:
			fmt.Println("exit sub goroutine")
			return
		default:
			fmt.Println("running...")
			time.Sleep(500 * time.Millisecond)
		}
	}
}
func main() {
	stop := make(chan bool)
	var wg sync.WaitGroup
	// Spawn example consumers
	for i := 0; i < 3; i++ {
		wg.Add(1)
		go func(stop <-chan bool) {
			defer wg.Done()
			consumer(stop)
		}(stop)
	}
	waitForSignal()
	close(stop)
	fmt.Println("stopping all jobs!")
	wg.Wait()
}
func waitForSignal() {
	sigs := make(chan os.Signal)
	signal.Notify(sigs, os.Interrupt)
	signal.Notify(sigs, syscall.SIGTERM)
	<-sigs
}

發佈了42 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章