Golang は高級言語であり、より自然言語や数式に近いプログラミングであり、基本的にマシンのハードウェア システムから切り離され、よりわかりやすい方法でプログラムを記述できるように設計されています。大規模システムの開発プロセスにおける実際的な問題を解決するために、同時実行性、統一された仕様、シンプルさと優雅さ、強力なパフォーマンスをサポートするように設計されており、主な目標は、Python などの動的言語の開発速度とパフォーマンスとセキュリティを組み合わせることです。 C/Cなどのコンパイル言語のこと。
このチュートリアルの動作環境: Windows 10 システム、GO バージョン 1.20、Dell G3 コンピューター。
go は高級言語です。 Go 言語は、2009 年に Google によってオープンソース化された高水準プログラミング言語です。大規模システムの開発プロセスにおける実際的な問題を解決するように設計されています。同時実行性、統一された仕様、シンプルさと優雅さ、強力なパフォーマンスをサポートしています。主な目標は、「Python などの動的言語の開発速度と、C/C などのコンパイル言語のパフォーマンスとセキュリティを組み合わせる」ことです。
コンピュータ言語は高級言語と低級言語に分けられます。高級言語とは、主にアセンブリ言語に関連したもので、より自然言語や数式に近いプログラミングであり、基本的に機械のハードウェアシステムから切り離して、人間にとって理解しやすいようにプログラムを記述します。書かれたプログラムをソースプログラムと呼びます。
高級言語は特定の言語を指すのではなく、人気のある go 言語、java、c、c、C#、pascal、python、lisp、prolog、FoxPro、Easy などの多くのプログラミング言語が含まれます。言語、中国語版C言語など。これらの言語は構文やコマンド形式が異なります。
Go 言語は、2009 年に Google によってオープンソース化された高水準プログラミング言語です。大規模システムの開発プロセスにおける実際的な問題を解決するように設計されています。同時実行性、統一された仕様、シンプルさと優雅さをサポートし、強力なパフォーマンスを備え、多くの Go 言語エバンジェリストによって「クラウド コンピューティング時代の C 言語」と称賛され使用されています。 Go言語の主な目標は、「Pythonなどの動的言語の開発スピードと、C/Cなどのコンパイル言語のパフォーマンスとセキュリティの両方を兼ね備えること」です。
Go 言語は、「C に似た言語」または「21 世紀の C 言語」と呼ばれることもあります。 Go は、同様の式構文、制御フロー構造、基本データ型、呼び出しパラメータ値の転送、ポインタ、その他多くのアイデアを C 言語から継承しており、C 言語が常に重視してきたコンパイルされたマシンコードの実行効率も備えており、既存の Seamless と一貫性があります。オペレーティングシステムへの適応。
Go Programmer's Voice の長所と短所: 現実の世界では、実稼働システムのプロトタイプの作成、テスト、デプロイを数日で行い、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 言語には次の欠点があります:
重量級のフレームワークが不足している。 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 スライス
スライスの最下層は配列です
スライスは配列のビューです
スライスは拡張できます後方展開はできませんが、前方展開はできません
s[i] は len を超えることはできません、また、後方展開は基礎となる配列の cap(s) を超えることはできません
スライスは内部的に 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
## になります。 #due 値による 渡されたリレーションシップは、appendmapGo 言語の戻り値を受け入れる必要があるため、型にはデフォルト値がありますマップ値のキーが存在しない場合はデフォルト値のみが返され、エラーは報告されません。キーが存在するかどうかを確認するには、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() }
の呼び出しには影響しません
以上がgolang は高級言語ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。