首頁  >  文章  >  後端開發  >  go是高階語言嗎

go是高階語言嗎

青灯夜游
青灯夜游原創
2022-12-06 18:05:435643瀏覽

go是高階語言。 Go語言是Google公司在2009年開源的高階程式語言,它為解決大型系統開發過程中的實際問題而設計,支援並發、規範統一、簡單優雅,性能強大;它的主要目標是「兼具Python 等動態語言的開發速度和C/C 等編譯型語言的效能與安全性」。

go是高階語言嗎

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

電腦語言具有高階語言和低階語言之分。而高階語言又主要是相對於彙編語言而言的,它是較接近自然語言和數學公式的編程,基本上脫離了機器的硬體系統,用人們更易理解的方式編寫程式。編寫的程式稱之為原始程式。

高階語言並不是特別指的某一種具體的語言,而是包含許多程式語言,如流行的go語言,java,c,c ,C#,pascal,python ,lisp,prolog,FoxPro,易語言,中文版的C語言等等,這些語言的語法、指令格式都不相同。

Go語言是Google公司在2009年開源的高階程式語言,它為解決大型系統開發過程中的實際問題而設計,支援並發、規範統一、簡單優雅,性能強大,被許多Go語言傳道者譽為「雲端運算時代的C語言」。 Go語言的主要目標是「兼具 Python 等動態語言的發展速度與 C/C  等編譯型語言的效能與安全性」。

go是高階語言嗎

Go語言有時候被描述為“C 類似語言”,或是“21 世紀的C語言”。 Go 從C語言繼承了相似的表達式語法、控制流結構、基礎資料型別、呼叫參數傳值、指標等很多思想,還有C語言一直所看中的編譯後機器碼的運作效率以及和現有作業系統的無縫適配。

Go的優缺點

程式設計師的心聲:如果現實世界需要我能夠在幾天內對一個生產系統進行原型設計、測試和部署,而且在每秒能處理比原來多5倍請求,CPU和記憶體的開銷還都很小。我想大概只有Go語言可以勝任了。

Go語言有以下優點:

  • 單獨的二進位發布:Go專案編譯會產生一個靜態的可執行檔。該檔案可獨立運作而不需要其他依賴。這種方式特別適合雲端原生容器環境。
  • 交叉編譯:在任何作業系統上都可以編譯在其他平台上可執行的二進位。例如在Mac系統上可編譯出在Linux和Windows上可執行的二進位。
  • 垃圾回收:Go語言支援垃圾回收。相比較,C ,Rust等需要開發者自己控制。
  • 執行效能:Go非常的快。性能接近C 。遠高於Java,Python、Node。
  • 開發效率:Go語言同時具備靜態語言的運作效能和動態語言的開發效率。
  • 簡單,高效率:Go語言的設計哲學裡就包含了簡單和高效。一個典型的反例就是複雜,臃腫的Java語言。
  • 並發性:語言層面支援並發,透過協程和通道簡化並發開發,提高並發效能。
  • 豐富的標準庫:Go標準庫覆蓋了文本,IO,網絡,加密,Web服務,遠端RPC,模板引擎等功能。
  • 可以呼叫C語言:可以呼叫C語言函數,進一步最佳化效能,重複使用C語言龐大的生態系統。
  • 快速編譯時間:Go的編譯特別快。大家可以參考兩款靜態部落格產生系統,Hexo(Node開發)和Hugo(Go開發)。
  • 工程型:Go語言設計的目的是成為一門工程語言,解決實際的工程問題。 Go語言定義了開發規範,並提供了豐富的工具。使用Go語言可以編寫出容易閱讀和理解,容易測試、維護和擴展的程式。 【相關推薦:Go影片教學程式教學

#Go語言有以下缺點:

#
  • 缺少重量級框架。如Ruby的Rails,Python的Django,Java的Spring。
  • 錯誤處理:沒有異常系統。 Go官方正在解決該問題。
  • 軟體包管理:很長一段時間以來,Go官方都沒有一套軟體包管理體制。直到最近,Go的1.13版本正式引入了Go Module作為官方的依賴管理工具。
  • 不是標準的物件導向的程式設計模型:這個也是Go語言的一個創新。如果你是堅實的OOP的擁護者,可能會有些不適應

#golang高階語法

##rune
package main

import "fmt"

//rune相当于go的char  使用utf8编码,中文占3个字节,英文一个字节

func main() {
	s:= "ok我爱你"
	fmt.Println(len(s))    // 11
	fmt.Println(len([]rune(s)))  // 5
	fmt.Println(len([]byte(s)))  // 11

	// str是int32类型
	for i, str := range s {
		fmt.Printf("%d %c", i, str)
		fmt.Println()
	}

	// str是byte类型
	for i, str := range []byte(s) {
		fmt.Printf("%d %x", i, str)
		fmt.Println()
	}

	// str是rune类型
	for i, str := range []rune(s) {
		fmt.Printf("%d %c", i, str)
		fmt.Println()
	}


}
slice切片
    slice的底層是陣列
  • slice是對數組的view
  • slice可以向後擴展,不可以向前擴展
  • s[i]不可以超過len(s), 向後擴展不可以超越底層數組cap( s)
  • slice內部維持了3個變量,ptr指標指向slice的第一個元素,len指定了slice的長度,cap指定了slice的容量。
  • slice進行append時,容量不夠會進行翻倍。
有如下
arr := [...]{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
则
s1值为[2,3,4,5],  len(s1)=4, cap(s1)=6 
s2值为[5,6], len(s2)=2, cap(s2)=3
slice底层是数组
slice可以向后扩展,不可以向前扩展
s[i]不可以超过len(s), 向后扩展不可以超越底层数组cap(s)
接着上题
arr := [...]{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
s3 := append(s2, 10)
s4 := append(s3, 11)
s5 := append(s4, 12)
则
s1值为[2,3,4,5]
s2值为[5,6]
s3值为[5,6,10]
s4值为[5,6,10,11]
s5值为[5,6,10,11,12]
arr值为[0, 1, 2, 3, 4, 5, 6, 10]

由于s4和时s5已经超过arr的cap,此时系统会生成一个新的数组,所以s4和s5是对新数组的view,即s4和s5 no longer view arr
    添加元素時如果超越cap,系統會重新分配更大的底層數組,原來的數組被拷貝過去,如果原來的數組沒人用則會被gc
  • 由於值傳遞的關係,必須接受append的回傳值
#map
##go語言所以類型都有預設值
  • 當map取值的key不存在時,只會傳回預設值,不會報錯。判斷key存不存在用key, ok := m[“key”]
  • map使用雜湊表,作為map的key必須可以比較相等
  • 除了slice,map, function的內建類型都可以作為key
  • struce類型不包含上述字段,也可以作為key
struct
#只有使用指標才可以改變結構體內容
  • nil指標也可以呼叫方法
  • 如何擴充系統型別或別人的型別:透過結構體繼承,透過型別起別名
  • package main
    
    
    // 如何扩充系统类型或者别人的类型:通过结构体继承,通过类型起别名
    type queue []int
    
    func (q *queue) push(v int) {
    	*q = append(*q, v)
    }
    
    func (q *queue) pop() int {
    	head := (*q)[0]
    	*q = (*q)[1:]
    	return head
    }
    
    func (q *queue) isEmpty() bool {
    	return len(*q) == 0
    }
    
    func main() {
    
    }
    值接受者vs指標接受者,
  • #值接受者是go語言特有
  • 要改變內容必須使用指標接受者,
  • 結構過大也考慮使用指標接受者。
  • 值/指標接受者都可以呼叫值/指標呼叫
  • #
    package main
    
    import "fmt"
    
    type node struct {
    	value int
    	left, right *node
    }
    
    func newNode(value int) *node{
    	return &node{
    		value: value,
    		left:  nil,
    		right: nil,
    	}
    }
    
    func (n node) setVal(val int) {
    	n.value = val
    }
    
    func (n *node) setValue(vall int) {
    	n.value = vall
    }
    
    func (n node) print() {
    	fmt.Println(n.value)
    }
    
    func (n *node) travel() {
    	if n == nil {
    		return
    	}
    
    	fmt.Println(n.value)
    	n.left.travel()
    	n.right.travel()
    }
    
    func main() {
    
    	var root node
    	root = node{}
    	root.left = &node{value:5}
    	root.right = new(node)
    	root.left.right = &node{4, nil, nil}
    	root.right.left = newNode(7)
    	
    	// 调用指针方法,相当于引用传递,可以改变外部的值
    	root.left.setValue(100)
    	fmt.Println(root.left.value)
    	
    	// 值传递,调用值方法,方法内部不能改变外部值
    	root.left.setVal(99)
    	fmt.Println(root.left.value)
    	
    	// 先序遍历
    	root.travel()
    }
interface

########多用介面組合###################defer############panic和return都不影響defer的呼叫#########更多程式相關知識,請造訪:###程式設計影片###! ! ###

以上是go是高階語言嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn