Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゴーファーくんと学ぶGo言語の世界/golang-world-with-gopher

iwasiman
March 14, 2023

 ゴーファーくんと学ぶGo言語の世界/golang-world-with-gopher

会社のミニ勉強会で使ったPowerPoint資料を、社内フォーマットを外したものです。知らない人向けにGo言語の基本情報周りを解説しています。
初心者向けなので説明を一部簡略化している箇所がありご容赦ください。

iwasiman

March 14, 2023
Tweet

More Decks by iwasiman

Other Decks in Programming

Transcript

  1. 2 この技術講習会(先端技術勉強会)について ⚫ グループ紹介後のメンバー大幅増加に大感謝~!!(パフパフ♪) ⚫ 頻度は不定、基本1Hちょい、だいたい夕方16時~にやっています。 ⚫ とりあえず始めてみて様子を見ながら続けます。 ⚫ 説明中も適宜間を挟むので、リアクションはその都度音声でもチャット

    でもOKです! ⚫ テーマはフリー、参加者から聞いたりして決めていきます。 ⚫ 次回テーマは [いよいよPythonかも?],[その後はフロントエンドネタ構想 中] でその後も募集中です! ⚫ 皆さんが講師をするのも大歓迎です! ゆるくやっていくので、気軽にいきましょう!
  2. 1. Go言語とは 2. シェア的な話 3. Go言語の特徴 4. Go言語の特徴からくる→嬉しいところ 5. Go言語の使いどころと思われるシーン

    6. 主要言語内での立ち位置① 7. 主要言語内での立ち位置② 8. 主要言語内での立ち位置③ 9. Go言語の言語仕様上のあれこれ 10.Go言語の開発環境 11.おまけ:実行速度イメージ(再掲) 12.まとめ ゴーファーくんと学ぶ 言語の世界 祝・再開催 Update版 2023/3/14
  3. 5 1. Go言語とは ◆Google発の21世紀のモダンな言語 ◆2009年登場。2012年v1.0、現在はv1.20.2 [2023/3/7] ◆Google社内の標準言語7つ: C/C++、Java、JavaScript、 Python、Go、TypeScript ◆“Better

    C”,「Pythonの開発速度とCの実行速度」を目指した ◆プログラマーの通り名もGopher。”GopherCon”というイベントも ◆“golang” “go-lang”「ゴーラング」「ゴーラン」とも ◆欠点: 単語”go”が一般的過ぎてググラビリティが低い! ◆採用事例 ◆公式より:Google、Dropbox、Meta(Facebook)、Microsoft、Netflix、Twitterなど ◆著名OSS:Docker、Kubernetes とコンテナを制する ◆日本:メルカリ/メルペイ、Gunosy、DeNA、サイバーエージェント、 クックパッド、ぐるなび、Freee、はてな、クラスメソッド などなど ◆インターネット系先進企業を中心に採用事例多し 日本ではメルカリ社がイベントや書籍など積極フォローで知られる ◆雑誌でもよく取り上げられる https://go.dev/ 似てい…いない!? 本物のgopher (ホリネズミ) New Brand Guide で Visual Identity が 公式定義。2018年刷新 Software Design誌2021/1月号 2023/2月号より新連載の 『なるほど納得Go言語』も開始中 2021/12 執筆陣が メルカリ/メルペイの一冊
  4. 6 2. Go言語のシェア的な話 ◆シェア的なところ ◆Stack Overflow Developer Survey 2020: Most

    Lovedな言語5位、Wanted3位 2022: Loved8位、Wanted4位 (Wantedの上位はRust, Python, TypeScript) →ここ数年で注目、学ぶ人多し ◆国内ではQiita エンジニア白書でよく使う言語は2022年でも14位に留まる。しかし これから習得したい言語は2020年1位、2021-2022年は2位。(1位はPython) →こちらでも今後の需要を踏まえ特定領域で注目 ◆ベンチャー、自社サービス系のエンジニアの求人広告でもよく見かける。 デキる人が習得するイメージあり。既に何らかの言語をマスターした エンジニアが2言語め以降で習得するパターン多し ◆技術同人誌でも題材で時々見かける ◆日本語で読める商業本では15冊(2022春) →20冊(2023/3)ほど。継続的に出ている https://insights.stackoverflow.com/survey/2020/#most-loved-dreaded-and-wanted https://survey.stackoverflow.co/2022/ https://cdn.qiita.com/assets/public/white_papers/2022-2960adf3d5e9e0c815f226960952162b.pdf 2022-2023年に 出た主な本たち
  5. 7 3. Go言語の特徴 ◆①OSごとのネイティブコードへコンパイルされる ◆シングルバイナリで動作、実行環境のインストールがいらない! ◆仮想マシンを使うJava、インタプリタ型言語(Python, Ruby, PHP, JS)より高速動作 ◆②マルチプラットフォームで動作

    ◆OSやCPUによる実行環境の差をほぼ隠蔽 ◆同じコードをWindows/Mac/Linuxそれぞれでビルドすると、.exeや実行ファイル が作られて動かせる。クロスコンパイル(Windows上でLinux用ビルド等)も可能。 ◆③OSに依存していない ◆OS固有のAPI類に頼らずに「車輪の再発明」を内部では敢えてやっている ◆バージョン等の影響を受けにくい ◆④ガベージコレクター(GC)をサポート ◆CやC++の宿命であるメモリ操作の問題を防止。「Better C」と言われる ◆書き手の習熟度で不具合を起こすよりはGCを提供しよう、という結論とのこと ◆⑤並行処理に強い ◆ゴルーチン、チャネルという言語機能で並行処理がシンプルに書ける 既に広く受け入れられ確立されている技術を再び一から 作ってしまうこと。どちらか言うと悪い意味に使う。 ①②あたりは Rustも同様です この④はRustと違うアプローチ ⑤はRustではライブラリ(Tokio)で可能
  6. 8 4. Go言語の特徴からくる→嬉しいところ ◆①圧倒的な実行速度 ◆C, C++よりコンパイルの速度も速いとのこと ◆LL系言語(Ruby, Python, PHP)より10~100倍高速と言われる ◆→パフォーマンスやメモリを気にせず書いてもだいたい大丈夫

    ◆②ポータビリティが高くインストール(≒デプロイ)が楽 ◆OSを気にせず、実行ファイル(+設定ファイル等)をコピーするだけ ◆JVMや.NETのインストール、Webサーバーの準備などがいらない。依存関係もない ◆→ Dockerコンテナ、Kubernetes、クラウド上で特に使いやすい。CLIツール系も ◆③標準ツール、標準ライブラリが”Battery included”で揃っている ◆JSON、net/httpなど。 フレームワークに頼らずWebアプリも作れてしまう ◆テストの仕組み、パッケージ管理の仕組みも最初から入っている ◆→Go本体さえ入れれば一通りのことができてしまう ◆④言語仕様が敢えてシンプル ◆構文が少なく、他言語経験者も学びやすいと言われている ◆→コーディング時にあまり迷わない ◆⑤コードスタイルも決まっている ◆go fmtという公式ツールが既に組み込まれている ◆→コーディング標準が定義済み。宗教戦争を回避 2013 2014 exeをcopy するだけ! copyか、こちらの マシン上でビルド Docker Image として登録 テストの仕組み,フォーマッター内蔵はRustも同様 モダン言語仲間!!
  7. 9 5. Go言語の使いどころと思われるシーン ◆GolangでGo!! ◆軽量級言語で作ったが実行速度が足りないWebアプリの置き換え ◆速度が欲しいバックエンド処理、バッチ処理 ◆大量データの処理や演算、並列処理、基盤など ◆Web API系開発(APIサーバー、モックサーバー) ◆Docker、Kubernetes、クラウド周り、マイクロサービス

    ◆社内に展開するツール(環境の差を吸収できる) ◆コマンドから実行するCLIツール、ちょっとした開発ツール類 ◆これまでC/C++が担っていた低レイヤーの処理 ◆ふつう ◆画面のあるアプリ (一応ライブラリはあるがあまり事例なし?) ◆使わない? ◆フロントエンド (ブラウザの上ではまだ動かない) ◆スマホのネイティブアプリ (言語仕様上はいちおう対応) ダミーのレスポンスを返して くれるテスト用サーバーのこと Webアプリ用フレームワークは Echo, Gin などが知られる ゴーファーくん入りのお酒のジン。シュール… →
  8. 10 6.主要言語内での立ち位置① Webアプリ フロントエンド (クライアントサイド) バックエンド(サーバーサイド, バッチ系も大まかに含む) コンパイル型言語(静的) インタープリタ型言語(動的,LL,軽量級,スクリプト系) 2014

    1996 2002 登場年 (基本はv1) 2012 1995 1995 1994 2015 2019 1995 2020 2009 2000年代後半頃から手軽さや 開発速度、アジャイルとの親和性で 若い企業で採用多し。 実行速度ではコンパイル型に劣る 2016 2003 モダン (ES6以降) モダン 2014 1987 Node.js, Denoは 言語でなくJS実行環境 JavaScript、型で強化した TypeScriptがフロントエンドの華。 ブラウザの上で動く言語は現状これだけ。 2013 Angular 2015 2012 WebAssembly(WASM,ワズム)とい う技術で、各言語の実行ファイルで JS処理を受け持ったり。Goの出番も? またフロントエンドの新ビルドツール 周りでGo,Rustの採用パターンが出現 Pythonの開発速度とC に近い実行速度、型安全 と型推論、大規模開発に 耐えるスケーラビリティ モダン モダン モダン JavaとC#が同世代 右の3つを「JVM系言語」 オレンジが2000年代後半以降の、 一般に”モダン”と分類される言語 ★定番言語でも新Verならモダンと 呼ぶ場合もアリ
  9. 11 7. 主要言語内での立ち位置② 低レイヤー、低水準、システムプログラミング 1972 1983 iOS: Objective-C→Swift Android: Java→Kotlin

    2012 2015 モバイル、 スマートデバイス コンパイル型言語(静的) 2014 2016 2018 2013 2015 モバイルバックエンド ネイティブアプリ開発 クロスプラットフォーム開発 Webアプリのバックエンド と同じ言語群 Flutter: AltJSのDart言語を使用 React Native: JavaScript .NET MAUI: C# ←★出たばかり! 2022 モダン モダン モダン モダン モダン メモリセーフな開発可能に Go:”Better C”止まり Rust:Cの完全置き換え になれるかも? Goも仕様上はiOS, AndroidOSに対応 とあるが、主領域は バックエンド 長らくC,C++の独壇場…
  10. 12 8. 主要言語内での立ち位置③ 2006 2010 どんな言語製のアプリも載せられるのでGoも もちろんOK。デプロイしやすさが強い 対応はC#, JavaScript, F#,

    Java, PowerShell, Python, TypeScript カスタムランタイムでGoとRustも可能 クラウド プラットフォーム AWS Lambda Auto scaling Amazon EC2 ②サーバーレス ①インスタンス上 コンテナ系サービスや マイクロサービス系: 同じく、コンテナへの デプロイしやすが強み ECR ECS or EKS EC2 or Fargate コンテナ、クラウド、マイクロ サービスの文脈全般で、 Go言語がよく登場する。 exeをcopyするだけ! 登録するところ 管理してくれるところ コンテナが動くところ ③(サーバーレス)コンテナ 2008 対応はNode.js(JS), Python, Go, Java, Ruby, PHP, .NET Core(C#) 仮想マシン 見えない コンテナ上で 動く関数 対応はJava、Go、PowerShell、 Node.js(JS)、C#、Python、Ruby シェア8-9割が手軽さ等からPythonと Node.jsらしい。速度が必要な場合や技術力 アピールでGo採用事例あり
  11. 13 9. Go言語の言語仕様上のあれこれ ◆言語仕様がシンプル:「Goに入ってはGoに従え」 ◆var name string = “aa” 形式、name

    := “aa” だと型推論してくれる ◆行末のセミコロン(;)不要 ◆whileループがなくてforループだけ ◆switch文の分岐の中のbreakがいらない ◆result = score > 80 ? “OK” : “NG”のような三項演算子がない ◆if文の中が1文だったら{}省略可、がない ◆関数だけでクラスがない(!) ◆オブジェクト指向の継承がない(!) 実はオブジェクト指向言語ではない。 ◆try-catchの例外機構がない(!) deferという別の機能で満たしている ◆配列は長さを宣言したら変更不可(エラー防止) 別にスライスという機能あり ◆データの構造は構造体(struct)を使う。関数を紐づけられる ◆関数の戻り値が複数返せる。最後の戻り値で正常/異常を返すのがお作法 ◆関数に関数を渡したり、関数から関数を返せたりする (関数型言語の系譜) “small is beautiful”を始めとしたUNIX思想の継承 「Googleのソフトウェア開発で生じた問題の解決」が目的で誕生 「開発やサービスがスケールする時に生じる複雑さに秩序をもたらす」がミッション シンプルさ(Simplicity):明確で過不足がない(clear and precise)を重視 →大規模プログラムで重要なスケーラビリティを確保、コードの信頼性と生産性を実現 なおコンパイラーは厳格です… ・ライブラリをimportして使わないと即エラー ・変数宣言して使わないと即エラー “When in Go, do as Gophers do.” 処理を実現するための記法が何通りもあったり せず、書き手の意図、コード動作が明確に 哲学があるよ
  12. 14 10. Go言語の開発環境 ◆公式サイトでインストーラー提供 ◆Windows/Mac/Linuxでそれぞれバイナリが別 ◆あとは環境変数$PATHに追加、$GOPATHを追加するだけ ◆プロジェクト新規作成時は後から追加されたGo Modulesのコマンドを使う ◆開発ツール ◆基本は.goのテキストファイル+αなのでツールに非依存

    (近年の言語はみなこう) ◆開発をサポートするツール類もコンソールベース多し (→CI/CDや自動化しやすい) ◆①好きな人はvim/emacs等のテキストエディタ (玄人向け渋チョイス) ◆②専用IDE: JetBrains社のGoLand (有償) ◆③総合エディタ: デファクトのVisual Studio Code (VSCode) ◆Goプログラマの41%がVSCodeを使っているらしい(2020年記事) ◆拡張機能の『Go』、メンテがGo開発チームに移管。これを入れればほぼ揃う 2015 GoLandは年間 3万円/1userぐらい 環境構築は割と簡単! Udemyにも入門講座アリ 入門は実質VSCode 一択でよさそうです 誕生5周年の イラスト (2014) ほぼ9百万ダウンロード!!
  13. 15 11. おまけ:実行速度イメージ(再掲) 遅い.. ガベージ コレクションの壁 仮想マシンの壁 インタプリタ型 言語の壁 最速!!

    JVM言語であるScala、Kotlinも大まかにはJavaと同程度と思われる。 C#も、JVMと似た仮想マシンの仕組みの上で動いている。 このインタプリタ型言語の壁までの間に、かなり 大きい速度の差あり。 Node.jsやDenoでのJS実行環境は比較的高速。 メモリ安全の防壁 機械語 機械語 中間ファイル 逐次実行 メモリ操作の罠 注:簡略化していますが、実際のプログラムの 実行速度には、これら「~の壁」以外にも 言語の仕組みなど様々な要素が関係します。 主要言語の中では遅め GCは搭載しているものの、仮想マシン を使う定番言語群よりも高速動作。 開発中もビルドが速い! 未来は分からないし正解は1つじゃない: ★Goの方が学習コストが低く生産性が高い。 もうシェアもある。Rustは難しいし流行らない! ★Rustの圧倒的な速さの前では、Goは いらなくなる! 言語機能も少ない! ..etc ネットでも双方のいろんな意見があります。 仲良くやりたいね
  14. 16 12. 本日のまとめ ◆マスコットのゴーファーくんがゆるくてかわいい。(重要) ◆Webのバックエンド等で動的言語より高い性能が引き出せ、 コンテナ・クラウド・マイクロサービスと親和性が高く、 型の恩恵・型推論やシンプルな言語仕様で品質・信頼性・生産性を確保、 低レイヤーの世界ではC言語の代わりにもなる言語。 ◆→他の言語のシェアを奪いとって代わるのではなく、隙間を上手く 埋めた立ち位置にある言語です。

    ◆技術トレンド的には、21世紀発のモダン言語群(Go, Rust, TypeScript, Kotlin, Swift, Dart)の中で、コンパイル型言語ではこのGoとRustが 特に注目されています。 それではまた次回! Creative Commons Attributions 3.0 The Gopher character is based on the Go mascot designed by Renée French. 資料中の様々なロゴやマスコットはその言語や技術の公式・非公式のものです。書影はその書籍・雑誌のものです。 第5回まで待機中…