溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

go是不是高級語言

發(fā)布時(shí)間:2022-12-07 09:38:17 來源:億速云 閱讀:109 作者:iii 欄目:編程語言

這篇文章主要介紹“go是不是高級語言”,在日常操作中,相信很多人在go是不是高級語言問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go是不是高級語言”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

go是高級語言。Go語言是Google公司在2009年開源的一門高級編程語言,它為解決大型系統(tǒng)開發(fā)過程中的實(shí)際問題而設(shè)計(jì),支持并發(fā)、規(guī)范統(tǒng)一、簡單優(yōu)雅,性能強(qiáng)大;它的主要目標(biāo)是“兼具 Python 等動態(tài)語言的開發(fā)速度和 C/C++ 等編譯型語言的性能與安全性”。

計(jì)算機(jī)語言具有高級語言和低級語言之分。而高級語言又主要是相對于匯編語言而言的,它是較接近自然語言和數(shù)學(xué)公式的編程,基本脫離了機(jī)器的硬件系統(tǒng),用人們更易理解的方式編寫程序。編寫的程序稱之為源程序。

高級語言并不是特指的某一種具體的語言,而是包括很多編程語言,如流行的go語言,java,c,c++,C#,pascal,python,lisp,prolog,F(xiàn)oxPro,易語言,中文版的C語言等等,這些語言的語法、命令格式都不相同。

Go語言是Google公司在2009年開源的一門高級編程語言,它為解決大型系統(tǒng)開發(fā)過程中的實(shí)際問題而設(shè)計(jì),支持并發(fā)、規(guī)范統(tǒng)一、簡單優(yōu)雅,性能強(qiáng)大,被很多Go語言傳道者譽(yù)為“云計(jì)算時(shí)代的C語言”。Go語言的主要目標(biāo)是“兼具 Python 等動態(tài)語言的開發(fā)速度和 C/C++ 等編譯型語言的性能與安全性”。

Go語言有時(shí)候被描述為“C 類似語言”,或者是“21 世紀(jì)的C語言”。Go 從C語言繼承了相似的表達(dá)式語法、控制流結(jié)構(gòu)、基礎(chǔ)數(shù)據(jù)類型、調(diào)用參數(shù)傳值、指針等很多思想,還有C語言一直所看中的編譯后機(jī)器碼的運(yùn)行效率以及和現(xiàn)有操作系統(tǒng)的無縫適配。

Go的優(yōu)缺點(diǎn)

程序員的心聲:如果現(xiàn)實(shí)世界需要我能夠在幾天內(nèi)對一個生產(chǎn)系統(tǒng)進(jìn)行原型設(shè)計(jì)、測試和部署,而且在每秒能處理比原來多5倍請求,CPU和內(nèi)存的開銷還都很小。我想大概只有Go語言可以勝任了。

Go語言有如下優(yōu)點(diǎn):

  • 單獨(dú)的二進(jìn)制發(fā)布:Go項(xiàng)目編譯會生成一個靜態(tài)的可執(zhí)行文件。該文件可獨(dú)立運(yùn)行而不需要其他依賴。這種方式特別適合于云原生容器環(huán)境。

  • 交叉編譯:在任何操作系統(tǒng)上都可以編譯在其他平臺上可運(yùn)行的二進(jìn)制文件。比如在Mac系統(tǒng)上可編譯出在Linux和Windows上可運(yùn)行的二進(jìn)制文件。

  • 垃圾回收:Go語言支持垃圾回收。相比較,C++,Rust等需要開發(fā)者自己控制。

  • 執(zhí)行性能:Go非常的快。性能接近于C++。遠(yuǎn)高于Java,Python、Node。

  • 開發(fā)效率:Go語言同時(shí)具備靜態(tài)語言的運(yùn)行性能和動態(tài)語言的開發(fā)效率。

  • 簡單,高效:Go語言的設(shè)計(jì)哲學(xué)里就包括了簡單和高效。一個典型的反例就是復(fù)雜,臃腫的Java語言。

  • 并發(fā)性:語言層面支持并發(fā),通過協(xié)程和通道簡化并發(fā)開發(fā),提高并發(fā)性能。

  • 豐富的標(biāo)準(zhǔn)庫:Go標(biāo)準(zhǔn)庫覆蓋了文本,IO,網(wǎng)絡(luò),加密,Web服務(wù),遠(yuǎn)程RPC,模板引擎等功能。

  • 可以調(diào)用C語言:可以調(diào)用C語言函數(shù),進(jìn)一步優(yōu)化性能,復(fù)用C語言龐大的生態(tài)系統(tǒng)。

  • 快速編譯時(shí)間:Go的編譯特別快。大家可以參考兩款靜態(tài)博客生成系統(tǒng),Hexo(Node開發(fā))和Hugo(Go開發(fā))。

  • 工程型:Go語言設(shè)計(jì)的目的就是成為一門工程語言,解決實(shí)際的工程問題。Go語言定義了開發(fā)規(guī)范,并提供了豐富的工具。使用Go語言可以編寫出容易閱讀和理解,容易測試、維護(hù)和擴(kuò)展的程序。

Go語言有如下缺點(diǎn):

  • 缺少重量級框架。如Ruby的Rails,Python的Django,Java的Spring。

  • 錯誤處理:沒有異常系統(tǒng)。Go官方正在解決該問題。

  • 軟件包管理:很長時(shí)間以來,Go官方都沒有一套軟件包管理體制。直到最近,Go的1.13版本正式引入了Go Module作為官方的依賴管理工具。

  • 不是標(biāo)準(zhǔn)的面向?qū)ο蟮木幊棠P停哼@個也是Go語言的一個創(chuàng)新。如果你是堅(jiān)實(shí)的OOP的擁護(hù)者,可能會有些不適應(yīng)

golang高級語法

rune

package main

import "fmt"

//rune相當(dāng)于go的char  使用utf8編碼,中文占3個字節(jié),英文一個字節(jié)

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的底層是數(shù)組

  • slice是對數(shù)組的view

  • slice可以向后擴(kuò)展,不可以向前擴(kuò)展

  • s[i]不可以超過len(s), 向后擴(kuò)展不可以超越底層數(shù)組cap(s)

  • slice內(nèi)部維持了3個變量,ptr指針指向slice的第一個元素,len指定了slice的長度,cap指定了slice的容量。

  • slice進(jìn)行append時(shí),容量不夠會進(jìn)行翻倍。

有如下
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底層是數(shù)組
slice可以向后擴(kuò)展,不可以向前擴(kuò)展
s[i]不可以超過len(s), 向后擴(kuò)展不可以超越底層數(shù)組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和時(shí)s5已經(jīng)超過arr的cap,此時(shí)系統(tǒng)會生成一個新的數(shù)組,所以s4和s5是對新數(shù)組的view,即s4和s5 no longer view arr

  • 添加元素時(shí)如果超越cap,系統(tǒng)會重新分配更大的底層數(shù)組,原來的數(shù)組被拷貝過去,如果原來的數(shù)組沒人用則會被gc

  • 由于值傳遞的關(guān)系,必須接受append的返回值

map
  • go語言所以類型都有默認(rèn)值

  • 當(dāng)map取值的key不存在時(shí),只會返回默認(rèn)值,不會報(bào)錯。判斷key存不存在用 key, ok := m[“key”]

  • map使用哈希表,作為map的key必須可以比較相等

  • 除了slice,map, function的內(nèi)建類型都可以作為key

  • struce類型不包含上述字段,也可以作為key

struct
  • 只有使用指針才可以改變結(jié)構(gòu)體內(nèi)容

  • nil指針也可以調(diào)用方法

  • 如何擴(kuò)充系統(tǒng)類型或者別人的類型:通過結(jié)構(gòu)體繼承,通過類型起別名

package main


// 如何擴(kuò)充系統(tǒng)類型或者別人的類型:通過結(jié)構(gòu)體繼承,通過類型起別名
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語言特有

  • 要改變內(nèi)容必須使用指針接受者,

  • 結(jié)構(gòu)過大也考慮使用指針接受者。

  • 值/指針接受者都可以調(diào)用值/指針調(diào)用

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)
	
	// 調(diào)用指針方法,相當(dāng)于引用傳遞,可以改變外部的值
	root.left.setValue(100)
	fmt.Println(root.left.value)
	
	// 值傳遞,調(diào)用值方法,方法內(nèi)部不能改變外部值
	root.left.setVal(99)
	fmt.Println(root.left.value)
	
	// 先序遍歷
	root.travel()
}

interface
  • 多用接口組合

defer
  • panic和return都不影響defer的調(diào)用

到此,關(guān)于“go是不是高級語言”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI