ホームページ  >  記事  >  バックエンド開発  >  go は高級言語ですか?

go は高級言語ですか?

青灯夜游
青灯夜游オリジナル
2022-12-06 18:05:435644ブラウズ

go は高級言語です。 Go 言語は、2009 年に Google によってオープンソース化された高水準プログラミング言語です。大規模システムの開発プロセスにおける実際的な問題を解決するために設計されており、同時実行性、統一された仕様、シンプルさ、優雅さ、強力なパフォーマンスをサポートしています。目標は「Pythonなどの動的言語の開発スピードと、C/Cなどのコンパイル言語のパフォーマンスとセキュリティの両方を兼ね備えること」です。

go は高級言語ですか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

コンピュータ言語は高級言語と低級言語に分けられます。高級言語とは、主にアセンブリ言語に関連したもので、より自然言語や数式に近いプログラミングであり、基本的に機械のハードウェアシステムから切り離して、人間にとって理解しやすいようにプログラムを記述します。書かれたプログラムをソースプログラムと呼びます。

高級言語は特定の言語を指すのではなく、人気のある go 言語、java、c、c、C#、pascal、python、lisp などの多くのプログラミング言語が含まれます。 、prolog、FoxPro、Yi言語、中国語版C言語など。これらの言語は構文やコマンド形式が異なります。

Go 言語は、2009 年に Google によってオープンソース化された高水準プログラミング言語です。 これは、大規模システムの開発プロセスにおける実際的な問題を解決するように設計されています。同時実行性、統一された仕様、シンプルさとエレガントさを兼ね備え、強力なパフォーマンスを備えたこの言語は、多くの Go 言語伝道者から「クラウド コンピューティング時代の C 言語」と称賛されています。 Go言語の主な目標は、「Pythonなどの動的言語の開発スピードと、C/Cなどのコンパイル言語のパフォーマンスとセキュリティの両方を兼ね備えること」です。

go は高級言語ですか?

#Go 言語は、「C に似た言語」または「21 世紀の C 言語」と呼ばれることもあります。 Go は、同様の式構文、制御フロー構造、基本データ型、呼び出しパラメータ値の転送、ポインタ、その他多くのアイデアを C 言語から継承しており、C 言語が常に重視してきたコンパイルされたマシンコードの実行効率も備えており、既存の Seamless と一貫性があります。オペレーティングシステムへの適応。

Go の利点欠点

プログラマーの声: 現実の世界で必要であれば、数日で実稼働システムのプロトタイプを作成、テスト、デプロイできます。元の 1 秒あたり 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 によって開発) という 2 つの静的ブログ生成システムを参照できます。
  • エンジニアリング タイプ: 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 配列のビューです。
  • スライスは後方に拡張できますが、前方に拡張することはできません。
  • s[i] は len(s) を超えることはできません。また、後方展開は基になるものを超えることはできません。 array cap( s)
  • Slice は内部的に 3 つの変数を保持します。ptr ポインタはスライスの最初の要素を指し、len はスライスの長さを指定し、cap はスライスの容量を指定します。
  • スライスを追加する際、容量が足りない場合は2倍になります。
  • 有如下
    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
要素を追加するときに上限を超えると、システムはより大きな基になる配列を再割り当てし、元の配列がコピーされます。元の配列を誰も使用しない場合、元の配列はコピーされます。 gc
  • 値の転送のため、append の戻り値を受け入れる必要があります
map# #go language so 型にはすべてデフォルト値があります
    マップ値のキーが存在しない場合、デフォルト値のみが返され、エラーは報告されません。キーが存在するかどうかを確認するには、key, ok := m["key"]
  • map を使用します。マップのキーは、スライスを除き、同等である必要があります。
  • マップおよび関数 組み込み型はキーとして使用できます。
  • struce 型には上記のフィールドが含まれていないか、キーとして使用できます。
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() {
    
    }
  • 値レシーバーとポインター レシーバー、
  • 値レシーバーは 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
パニックとリターンは影響しませんコールを延期する
プログラミング関連の知識については、
    プログラミング ビデオ
  • をご覧ください。 !

以上がgo は高級言語ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。