カテゴリー: Programming

  • 2日目:Go言語プロジェクトの初期設計とGoogle Books APIで直面した問題

    2日目:Go言語プロジェクトの初期設計とGoogle Books APIで直面した問題

    はじめに

    昨日行った作業を振り返り、進捗と発見した課題について整理しました。本記事では、Google Books APIを活用して書籍情報を取得するアプリケーションをGo言語で構築する中での進捗、問題点、および解決策の概要を報告します。また、次回以降に取り組むべき課題についても触れています。

    昨日の進捗

    以下の内容を完了しました:

    1. プロジェクトの初期設定
      • Go言語でのプロジェクト構造を作成。
      • 必要なディレクトリやファイルを整理し、基本的な構成を決定。
    2. Google Books APIs の連携
      • 書籍情報(タイトル、著者、出版社、カテゴリーなど)を取得するプログラムを実装。
    3. 動作確認
      • テストデータを用いてAPIのレスポンスを確認し、基本的な情報取得が機能することを確認。

    プロジェクトのディレクトリ構成

    以下のようなディレクトリ構造でプロジェクトを構築しました。この構成により、コードの可読性と保守性を向上させています。

    BookReview/
      ├── cmd/
      │    └── main.go        // エントリーポイント
      ├── internal/
      │    ├── models/       // 書籍情報のデータモデル
      │    ├── services/     // ISBN検索API呼び出しロジック
      │    └── handlers/     // HTTPハンドラー
      ├── templates/         // HTMLテンプレート
      ├── static/            // 静的ファイル
      └── config/            // 環境設定ファイル

    ISBN番号、Google Books APIs 、 Go言語を使った表示例

    Google Books APIs を使った最小限のロジック

    以下に、GoでGoogle Books APIを使用して書籍情報を取得する最小限のサンプルコードを示します。この例では、特定のISBN番号に基づいて書籍情報を取得します。

    ここに示す例は今回実装したコードではありません。

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"net/http"
    )
    
    func main() {
    	// Google Books API エンドポイント
    	apiURL := "https://www.googleapis.com/books/v1/volumes?q=isbn:9781449331818"
    
    	// HTTPリクエストを送信
    	resp, err := http.Get(apiURL)
    	if err != nil {
    		fmt.Println("Error:", err)
    		return
    	}
    	defer resp.Body.Close()
    
    	// レスポンスのデコード
    	var result map[string]interface{}
    	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
    		fmt.Println("Error decoding JSON:", err)
    		return
    	}
    
    	// 必要な情報を表示(最初の結果のみ)
    	if items, ok := result["items"].([]interface{}); ok && len(items) > 0 {
    		volumeInfo := items[0].(map[string]interface{})["volumeInfo"].(map[string]interface{})
    		fmt.Println("Title:", volumeInfo["title"])
    		fmt.Println("Authors:", volumeInfo["authors"])
    	} else {
    		fmt.Println("No results found.")
    	}
    }

    実行手順

    1. このコードをローカル環境に保存します(例: main.go)。
    2. 必要に応じてGoをインストールして環境を設定します。
    3. ターミナルでコードをコンパイル&実行します:go run main.go

    ポイント

    • ISBN指定: URLパラメータ q=isbn:ISBN番号 を使っています。
    • 最小限のロジック: エラー処理や高度な解析は省き、基本的な取得と表示に焦点を当てています。

    Google Books APIs の基本仕様

    Google Books API: ISBNで書籍情報を取得する仕様

    Google Books API は、特定のISBN番号をクエリパラメータとして指定することで書籍情報を取得できます。

    基本URL

    https://www.googleapis.com/books/v1/volumes

    リクエストパラメータ

    • q: 検索クエリ。ISBN番号を指定する際は isbn:ISBN番号 の形式で指定します。
      • 例: q=isbn:9781449331818

    サンプルリクエストURL

    https://www.googleapis.com/books/v1/volumes?q=isbn:9781449331818

    レスポンス例

    レスポンスはJSON形式で返されます。一部抜粋したサンプルレスポンスは以下の通りです。

    {
      "kind": "books#volumes",
      "totalItems": 1,
      "items": [
        {
          "volumeInfo": {
            "title": "Learning JavaScript Design Patterns",
            "authors": ["Addy Osmani"],
            "publisher": "O'Reilly Media",
            "publishedDate": "2012-08-30",
            "description": "A book description.",
            "industryIdentifiers": [
              {
                "type": "ISBN_10",
                "identifier": "1449331815"
              },
              {
                "type": "ISBN_13",
                "identifier": "9781449331818"
              }
            ],
            "pageCount": 254,
            "language": "en",
            "previewLink": "http://books.google.com/..."
          }
        }
      ]
    }

    必要な情報の取り出し

    レスポンスJSONから以下の情報を取り出すには、対応するキーを下記のように利用します。

    • タイトル: items[0].volumeInfo.title
    • 著者名: items[0].volumeInfo.authors
    • 出版社名:items[0].volumeInfo.publisher
    • 出版日: items[0].volumeInfo.publishedDate

    制限事項と注意点

    1. APIキー: 一部のリクエストにはGoogle Cloud Consoleで取得できるAPIキーが必要になる場合があります。
    2. エラー処理: 不正なISBNやネットワークエラーへの対応が必要です。
    3. 利用制限: APIには日単位の利用制限があります。

    進行中の課題と仮説

    問題1: Google Books API のレスポンスにおける「publisher」フィールドの欠落

    • 現象: テストした6冊のデータのうち、すべての書籍で「出版社名」が取得できませんでした。

      「15冊分のISBN番号でテストした結果、出版社情報も正しく表示されることを確認しました。一方で、Google Books APIでは出版社名やカテゴリー情報が少ない傾向があることが分かりました。
    • 仮説: APIレスポンスに publisher フィールドが含まれない書籍が多い可能性。
    • 対策案:
      1. 他の書籍で再テストを行い、再現性を確認。
      2. デフォルト値を設け、ユーザーが手動で補完できる仕組みを検討。
      3. 複数のAPIを併用する

    問題2: 詳細なエラーハンドリングの不足

    • 現象: APIリクエストの失敗や不完全なレスポンスに対する処理が未実装。
    • 対策案:
      • 各種エラーパターンに対応したハンドリングを追加。
      • ログ出力を強化してデバッグを容易にする。

    感想と成功点

    • 成功点:
      • プロジェクト構造を整理し、後の拡張を考慮した設計を実現。
      • Google Books APIの基本的な利用方法を習得し、データ取得が可能になった。
    • 課題:
      • レスポンスに欠落データが多い場合の対策が必要。
      • ISBNコードの読み取り機能や詳細エラー処理の実装がまだ不足している。

    今後の予定

    1. Google Books API のレスポンス解析:
      • 欠落データの原因を特定し、対応策を検討する。
      • 「出版社名」取得の代替案を考える。
    2. エラーハンドリングの改善:
      • リクエストエラーや不完全なレスポンスに対応するロジックを追加。
    3. 次のステップ:
      • カメラでISBNコードを読み取る機能のプロトタイプ作成。
      • 書籍情報をローカルデータベースに保存する仕組みの構築。
      • 書影画像がない場合にデフォルト画像を表示する処理の改善。

    おわりに

    今回はプロジェクトの進捗を中心に振り返りました。課題がいくつか見つかりましたが、これらを解決しながら、Go言語とアジャイル開発の学びを深めていきたいと思います。次回以降、より詳細な実装例や学びのポイントを共有していきますので、ご期待ください!

  • 【初日】「読んだ本のレビューアプリ」開発スタート! ~Go言語×アジャイル×ChatGPT & Copilot~

    【初日】「読んだ本のレビューアプリ」開発スタート! ~Go言語×アジャイル×ChatGPT & Copilot~

    はじめに

    今日から、新しいチャレンジを始めます。それは「読んだ本のレビューを残すアプリ」をGo言語でアジャイル開発し、学びながら進めること。さらに、開発の過程でChatGPTやGitHub CopilotといったAIアシスタントを「仮想ペアプロ」として活用します。

    なぜこんなことをやろうと思ったのか?

    • Go言語を実践的に学びたい
      APIサーバやDB操作、テンプレート処理を通して学ぶ。
    • 読書記録アプリを作りたい
      ISBNで書籍情報を取得し、そこにレビューやメモを残せるプラットフォーム。
    • アジャイル開発で柔軟に
      段階的に機能を増やし、完成度を上げていく。
    • ChatGPT & Copilot活用
      詰まったらChatGPTに相談し、コード補完はCopilotに任せる。
    • 最終的にはカメラでバーコード読み取り
      QuaggaJSやZXingなどのJSライブラリを使い、スマホやPCのカメラでISBNをスキャン→自動的に書籍情報取得する流れを目指す。

    目標とロードマップ

    最終形をざっくりイメージすると、

    1. ISBN検索機能(外部API連携) → 書籍基本情報を取得
    2. レビュー機能 → 書籍情報に対してメモやコメントを保存
    3. バーコード読み取り機能(フロント側) → スマホやPCのカメラでISBNをスキャン、手入力不要
    4. メモ管理(編集・削除・一覧表示) → 本格的なレビューデータベース

    これらをアジャイル的な小さなスプリントで区切って進めます。

    スプリント例

    • スプリント1: ISBN検索API(Goで外部API連携)
    • スプリント2: フロントエンドでISBN入力→検索結果表示
    • スプリント3: DB導入・レビュー記録機能追加
    • スプリント4: レビュー編集・削除、一覧表示
    • スプリント5: QuaggaJSやZXingを使ったバーコード読み取り機能実装
    • スプリント6: デプロイ、UI改善、総仕上げ

    ※ スプリント数や内容は柔軟に変更する可能性あり


    今日(Day 1)の活動結果

    • プロジェクトのディレクトリ作成:
      BookReviewを作成
    (base) ******\projects\go\mkdir BookReview
    (base) ******\projects\go\cd BookReview
    • Gitの初期化:
      git int でディレクトリのディレクトリを作成
    (base) ******\projects\go\BookReview> git init
    • Goの初期化:
      Go言語のプロジェクトフォルダなので go の初期化も設定。

    Go言語プロジェクトでモジュール管理を行う場合、go mod コマンドによる初期化が必要になることがあります。特に、外部パッケージを利用する際や、プロジェクトをより構造的に管理したい場合は以下のステップを踏むことが一般的です。

    コマンド例:

    (base) ******\projects\go\BookReview> go mod init bookreview

    実行結果:

    go: creating new go.mod: module bookreview
    • GitHubリポジトリ作成my-book-review-app のようなプロジェクト名でリポジトリ作成。
    GitHub repositoly
    • HTTPサーバ起動テスト
      簡単なGo HTTPサーバを作り、「Hello, Book Review World!」が表示されるか確認。
    package main
    
    import (
    	"fmt"
    	"net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
    	fmt.Fprintln(w, "Hello, Book Review World!")
    }
    
    func main() {
    	http.HandleFunc("/", handler)
    	fmt.Println("サーバーがポート8080で起動しています...")
    	http.ListenAndServe(":8080", nil)
    }
    // ビルドと実行
    (base) ****** \projects\go\BookReview> go build
    (base) ****** \projects\go\BookReview> ./BookReview
    サーバーがポート8080で起動しています...
    // 実行のみ
    (base) ****** \projects\go\BookReview> go run .\main.go
    サーバーがポート8080で起動しています...
    種類の実行方法
    Hello, Book Review World! の表示例
    実行結果です
    • ChatGPT活用:PATH設定でちょっと悩んだが、ChatGPTに質問→すぐ解決できました。
    • GitHub Copilot活用テスト:ハンドラー関数を書く際にCopilotが補完してくれ、今後が楽しみ。

    HTTPサーバ起動テスト用コードの内容確認

    上記で表した Go 言語を使った基本的な Web サーバーを実装したコードについてまとめました。


    1. package main

    • Go プログラムのエントリポイントを示します。main パッケージは実行可能なプログラムを構成する特別なパッケージです。

    2. import 文

    import (
    	"fmt"
    	"net/http"
    )
    
    • 必要なライブラリをインポートしています。
      • fmt: フォーマットされた I/O 関数(例: Println)を提供します。
      • net/http: HTTP サーバーやクライアントを扱うための機能を提供します。

    3. func handler(w http.ResponseWriter, r *http.Request)

    • これは HTTP リクエストを処理するハンドラー関数です。
      • w http.ResponseWriter: HTTP レスポンスを書き込むためのインターフェース。
      • r *http.Request: クライアントから送信された HTTP リクエストを表します。
    • この関数では、fmt.Fprintln を使ってレスポンスに「Hello, Book Review World!」という文字列を書き込んでいます。

    ハンドラー関数とは

    HTTP リクエストを処理するハンドラー関数とは、Webサーバーに来たリクエスト(アクセス)を受け取って、それに対する処理を行う関数のことです。

    この関数は2つの重要な要素を受け取ります。

    • レスポンスライター(w):クライアントへの返信を書き込むためのツール
    • リクエスト(r):クライアントから送られてきた情報

    具体的には、このコードではクライアントがアクセスしてきた時に「Hello, Book Review World!」というメッセージを返す処理を行っています。


    4. func main()

    • プログラムのエントリポイントです。以下の処理を行います。

    エントリーポイントとは?

    エントリーポイントとは、プログラムの実行が開始される場所を指します。

    Go言語では、mainパッケージ内のmain関数がエントリーポイントとなり、プログラムはここから実行が始まります。

    このプログラムの場合、main関数の中で

    • HTTPハンドラーの設定
    • サーバーの起動
    • ポート8080でのリッスン開始

    という一連の処理が実行されます。

    (1) http.HandleFunc("/", handler)

    • ルート URL("/")にアクセスしたときに実行されるハンドラー関数を登録します。
      • ここでは handler 関数が登録されています。
      はい、その通りです。このコードの流れは以下のようになっています:
      1. main関数内でhttp.HandleFunc("/", handler)を使って、ルートURL(”/”)へのアクセスがあった時に実行される関数としてhandlerを登録します。
      2. クライアントがWebサーバーのルートURLにアクセスすると、登録されたhandler関数が呼び出され、「Hello, Book Review World!」というメッセージを返します。
      これは、Webサーバーでよく使われる「ルーティング」と呼ばれる仕組みの基本的な例です。特定のURLパターンに対して、それを処理する関数を関連付けているのです。

    (2) fmt.Println("サーバーがポート8080で起動しています...")

    • コンソールにサーバーが起動中であることを表示します。

    (3) http.ListenAndServe(":8080", nil)

    • ポート 8080 で HTTP サーバーを起動します。
      • ":8080": サーバーがリッスンするポート番号。
      • nil: デフォルトのマルチプレクサを使用することを指定しています。

    実行結果

    1. プログラムを起動すると、ターミナルに以下が表示されます。 コードをコピーする サーバーがポート8080で起動しています...
    2. ブラウザで http://localhost:8080/ にアクセスすると、以下のレスポンスが表示されます。 コードをコピーする Hello, Book Review World!

    学べるポイント

    1. HTTP サーバーの起動方法
      • Go では net/http パッケージを使って簡単に Web サーバーを構築できます。
    2. ハンドラー関数の作成
      • HTTP リクエストを処理するカスタムロジックを実装できます。
    3. ポートの指定
      • ポート番号を指定することで、どのポートでサーバーを動作させるかを制御します。
    4. シンプルな構成
      • Go の標準ライブラリだけで基本的な Web アプリケーションを構築可能です。

    このコードをベースに、さらに機能を追加してアプリケーションを拡張していくことができます!

    明日以降にやること

    • Day 2: Google Books APIなどを叩いて、ISBN指定でタイトル取得のプロトタイプを作る。
    • 中盤: DB導入し、書籍レビューを保存できるようにする。
    • 後半: QuaggaJSやZXingでカメラアクセス実装→バーコード読み取り→ISBN取得→書籍情報表示の流れを完成!

    なぜバーコード読み取り?

    入力を極力簡略化したいからです。

    • 手でISBNを入力する手間を省く
    • スマホのカメラで本のバーコード(ISBN)をスキャン→即座に書籍情報表示→レビュー記入、というスムーズなUXを提供したい

    まとめ

    今日は地ならし。Go言語でHello World的なHTTPサーバが起動できました。明日から、いよいよISBN検索APIの実装に入っていきます。最終的にはカメラでバーコード読み取りも実現し、より便利な読書記録ツールに育てていく予定。ChatGPT & Copilotと二人三脚で、試行錯誤しながら前進していきます!

  • Go言語で挑む読書体験のアップグレード:レビューアプリ開発プロジェクト、まもなく始動!

    Go言語で挑む読書体験のアップグレード:レビューアプリ開発プロジェクト、まもなく始動!

    プロジェクトの方向性

    エンジニアとしてスキルを研鑽しながら、自分の趣味である「読書」をより豊かにできるツールがあったら面白い――そんな発想から、新たなWebアプリ開発プロジェクトに着手しようと考えています。もともと考えていたのですが、最近のあることがきっかけで作る決心がつきました。

    使用する言語はGo言語。高パフォーマンスでシンプルな構文、強力な並行処理を持ち、近年注目度が増しているGoを用いて、クラウド環境でもスムーズに稼働するようなアプリケーションを目指します。

    アプリの概要

    構想中のアプリは、読み終えた本や現在進行中の本に対し、自分なりの読書メモ(レビュー)を気軽に蓄積できるWebアプリです。ただのメモ帳ではなく、ISBN番号を起点に書籍情報を自動取得する仕組みを導入します。

    • ISBN検索で基本情報を自動取得
      タイトル、著者名、出版社、ページ数、あらすじ、カテゴリー、さらには表紙画像(書影)まで――合法的な外部APIを活用し、オープンデータや著作権上問題のないサービスから情報を取得する予定です。
    • レビュー(読書メモ)の保存・管理
      書籍情報と紐づいたレビューを蓄積することで、自分だけのデジタル書庫&読書日記を形成。過去に読んだ本を検索し、あの時何を感じていたのか、どんな学びを得たのかをすぐに振り返ることができます。

    技術的こだわり

    なぜGo言語なのか?

    • 高いパフォーマンスと低いメモリフットプリント
      将来的にユーザー数が増えたり、クラウド環境に乗せてもストレスなく動く構成を目指したい。
    • 標準ライブラリの充実とWeb向きな設計
      Goは標準でHTTPサーバー機能を持ち、JSON扱いもシンプル。API連携での外部リソースコールも簡潔に書けます。
    • 将来のスケールアップも見据えた選択
      もしこのツールが軌道に乗り、ユーザーが増えてもGoの特性が足枷にはなりにくいはずです。

    将来の展開

    このアプリが完成し、実用レベルに達したら、Google PlayやAppleのApp Storeへのリリースも検討します。もちろん、その際はモバイル向けのUI最適化やPWA(Progressive Web App)対応などを検討し、より多くの人が使いやすい形で公開したい。
    「自分で作った実用的なサービスを世に出す」ことは、エンジニアとしての実績の一つになるでしょう。公開できるプロダクトがあることは、ポートフォリオとしても有効で、スキルアップに繋がることは間違いありません。

    次回からの連載予定

    次回以降は、実際の開発プロセスを日々(または定期的)記事にし、アジャイル的な進め方で機能を拡張していく様子を公開する予定です。

    • 開発環境のセットアップ
    • ISBN検索機能のプロトタイプ実装
    • 書籍情報APIの選定と連携
    • レビュー入力機能
    • データベース導入、編集・削除機能追加
    • 書影やあらすじなどのメタ情報取得
    • モバイル対応やPWA化、ストア公開に向けた準備

    これらのステップを通じて、日々の学びと試行錯誤を記録することで、自己成長を明確にし、エンジニアとしての「箔」をさらに増していきたいと思います。

  • Go言語で学ぶ出力の基本:Print, Println, Printfの違いを徹底解説

    Go言語で学ぶ出力の基本:Print, Println, Printfの違いを徹底解説

    こんにちは!今回は前回初挑戦したGo言語の続きを進めていきたいと思います。初めてなので疑問に思ったところなどを掘り返し、少し新しいことに挑戦していきたいと思います。

    今回もWindows11 , VSCode, Go言語で進めていきます。

    前回の『Hello, world!』の復習から

    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Hello, World!")
    }

    何のへんてつもないGo言語の「Hello, world!」ですが、気になったのは2つありました。

    「Package main」と「import “fmt”」です。

    Package main について

    Go言語では、コードは パッケージ に属するようです。package キーワードを使って、そのコードがどのパッケージに属しているかを宣言します。C言語やJavaと同じですね。

    1. main パッケージについて
      • 特別な役割を持つパッケージです。
      • Goプログラムのエントリーポイントを示します。main パッケージを含むコードが必ず存在しないと、実行可能なプログラムは作成できません。
      • このパッケージ内に、func main() を定義する必要があります。この main() 関数がプログラムのスタート地点です。
    2. パッケージの用途
      • Goでは、コードを整理し、再利用可能にするためにパッケージを利用します。
      • 例: fmt はフォーマット処理用の標準パッケージ、math は数学演算用のパッケージです。

    import “fmt”について

    Go言語では、import文を使って必要なパッケージを現在のコードに読み込みます。この「パッケージ」は、他の言語における「ライブラリ」や「モジュール」と似た役割を果たします。たとえば、標準パッケージであるfmt(フォーマット出力)やtime(時間操作)をコード内で使用するには、import文で宣言します。

    Goでは、標準パッケージであってもimport文を省略せず明示的に記述するのが基本ルールです。また、パッケージ名が長く使いづらい場合には、エイリアス(別名)を設定して簡潔に利用することができます。

    1. fmt パッケージについて
      • fmt (フォーマット) はGoの標準パッケージの一つです。
      • 主に以下のような入出力操作を提供します。
        • 標準出力にテキストを表示: fmt.Println(), fmt.Printf()
        • 文字列をフォーマット: fmt.Sprintf()
        • 標準入力を取得: fmt.Scan()
    2. 使い方の例
    fmt.Println("Hello World!") // 改行付きで文字列を表示
    fmt.Printf("こんにちは、%s さん\n", "Go言語") // 書式指定で表示

    エイリアスを使ったインポート

    import f "fmt"
    
    func main() {
        f.Println("Hello, alias!")
    }

    パッケージを使う理由

    • 再利用性: 標準ライブラリや他のパッケージのコードを利用して、ゼロから機能を実装する必要を省けます。
    • 機能の分離: 各パッケージは特定の機能に焦点を当てており、管理しやすくなります。

    復習のまとめ

    • package main: 実行可能なプログラムを作成するための特別なパッケージ。
    • import "fmt": 標準出力などを行うために、Goの標準ライブラリ fmt をインポート。

    今日のお題

    さて、今日のお題は『Go言語 fmt & time package と3種類のPrint文』でした。

    用意したGoコードは以下の通りです。

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
        var name string
        fmt.Print("名前を入力してください: ")
        fmt.Scanln(&name)
    
        // 現在の日時を取得
        now := time.Now()
    
        // 日付と時刻をフォーマットして表示
        fmt.Printf("こんにちは、%sさん!\n", name)
        fmt.Printf("今日は %s です。\n", now.Format("2006年1月2日"))
    }
    

    PrintfとScanlnを見たとき、C言語に似ていると感じて個人的に興奮しました。

    また、Print文が3種類ある点にも興味を惹かれますね。さらに、新しいライブラリであるtimeも登場しており、これも気になります。

    実行結果は以下の通りです。

    赤枠が実行した結果です。

    コードの説明

    1. import "time":
      • 現在の日付や時刻を取得するために time パッケージをインポートします。
    2. time.Now():
      • 現在の日時を取得する関数です。
    3. now.Format("2006年1月2日"):
      • time.Time 型のデータをフォーマットして文字列として表示します。
      • Goでは、このフォーマット文字列がユニークで、2006-01-02 15:04:05 のように指定することで日付と時刻を整形します。
    4. 挨拶と日時を表示:
      • fmt.Printf を使って、名前と日時を組み合わせたメッセージを表示します。

    実行例

    名前を入力してください:Miyakawa
    こんにちは、Miyakawaさん!
    今日は 2024年12月6日 です。

    新たに登場したPrintとPrintfのコマンドについて考えてみました。

    そういえば、JavaにはPrintlnやprintというコマンドがありましたね。
    一方、C言語ではprintfが標準的に使用されていた記憶があります。そこで、今回Print、Println、Printfについて整理してみることにしました。

    1. fmt.Print

    • 目的: 単純に文字列や値を出力する。
    • 改行しない: 出力後に自動で改行されません。
    fmt.Print("こんにちは")
    fmt.Print("世界")

    出力

    こんにちは世界

    使う場面:単語の後ろに改行コードがないため、ひとつなぎの文になります。複数の値を連続で出力したい場合などに利用します。


    2. fmt.Println

    • 目的: 改行付きで文字列や値を出力する。
    • 改行する: 出力後に自動で改行されます。
    fmt.Println("こんにちは")
    fmt.Println("世界")

    出力

    こんにちは
    世界

    使う場面: 改行コードが自動で付与されます。各出力を見やすく改行して表示したい場合。


    3. fmt.Printf

    • 目的: フォーマット指定子を使って、出力の形式を細かく制御する。
    • 改行しない: 必要なら明示的に \n を追加する必要があります。
    name := "太郎"
    age := 30
    fmt.Printf("こんにちは、%sさん!あなたは%d歳です。\n", name, age)

    出力

    こんにちは、太郎さん!あなたは30歳です。

    主なフォーマット指定子

    • %s: 文字列
    • %d: 整数
    • %f: 浮動小数点数
    • %v: 任意の型の値
    • %T: 値の型

    使う場面: 出力内容を整形する必要がある場合や、複雑な情報を見やすく表示したい場合。

    Print, Println, Printf まとめ

    メソッド改行の有無主な用途
    Printなし単純な文字列・値を出力したい場合
    Printlnあり単純な文字列・値を出力したい場合
    Printfなし書式指定でフォーマットしたい場合

    総合まとめ

    この記事では前回の『Hello, World!』の振り返りからの繋がりで、Go言語の出力方法をまとめました。

    また、fmt 以外の time ライブラリを使ってみました。

    複数のライブラリを同時にインポートする場合は( )をうまく使うことを学習しました。

    用途に応じた使い分けをマスターし、コードの効率と可読性を向上させていきたいと思います。

  • Go言語初体験!Hello WorldからWebサーバーまで作ってみた

    Go言語初体験!Hello WorldからWebサーバーまで作ってみた

    こんにちは!今回、初めてGo言語(Golang)を使ってプログラミングをしてみました。Windows環境でVisual Studio Code(以下、VSCode)を使用し、簡単な「Hello World」プログラムからWebサーバーを動かすまでを試したので、その手順と感想を共有します。

    Go言語の魅力とは?

    Go言語はGoogleによって開発されたシンプルで高速なプログラミング言語です。特に以下の特徴に惹かれて始めてみました:

    • 高いパフォーマンス: コンパイル型で実行速度が速い。
    • シンプルな構文: 学びやすく、読みやすいコードを書くことができる。
    • 並行処理が簡単: goroutine という軽量スレッドで並行処理が簡単。

    準備:Go言語のインストール

    1. 公式サイトからダウンロード
      Go言語は公式サイト(Go公式ダウンロードページ)からインストーラーをダウンロードできます。
    2. インストール
      ダウンロードしたインストーラーを実行し、指示に従ってインストールします。
    3. インストール確認
      コマンドプロンプトまたはPowerShellを開き、以下を実行:
    go version

    インストールされていれば、Goのバージョン情報が表示されます。

    1. 初めての「Hello World!」

    最初に書いたプログラムは、Go言語のお決まり「Hello World!」です。

    コード

    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Hello, World!")
    }

    手順

    1. ファイルを作成
      VSCodeで hello_world.go というファイルを作成。
    2. 実行
      ターミナルで以下を実行
    go run hello_world.go
    
    # 下記が実行結果
    Hello, World!

    短いコードで簡単に結果が得られるのが嬉しいですね!


    2. 簡単なWebサーバを作る

    次に、Go言語で簡単なWebサーバを作成しました。ブラウザでアクセスすると、「Hello, Go Web Server!」と表示されるものです。

    コード

    package main
    
    import (
    	"fmt"
    	"net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
    	fmt.Fprintln(w, "Hello, Go Web Server!")
    }
    
    func main() {
    	http.HandleFunc("/", handler)
    	fmt.Println("サーバーがポート8080で起動しています...")
    	http.ListenAndServe(":8080", nil)
    }

    手順

    1. ファイルを作成
      VSCodeでgo_server.go というファイルを作成(web_server.go にすればよかったと後から後悔)。
    2. 実行
      ターミナルで以下を実行
    go run go_server.go

    結果として以下のようなメッセージが表示されます


    3. ブラウザで確認

    • http://localhost:8080 にアクセスすると、「Hello, Go Web Server!」と表示されます。

    コードの解説

    • http.HandleFunc("/", handler)
      “/”(ルートパス)にアクセスした際に handler 関数を実行します。
    • handler 関数
      クライアントに「Hello, Go Web Server!」と返します。
    • http.ListenAndServe(":8080", nil)
      ポート8080でHTTPサーバを起動します。
    VSCode
    VS Code 上の表示
    http://localhost:8080「Hello, Go Web Server!」が表示されている。
    ブラウザ上での表示結果

    3.実際に試して感じたこと

    • 簡単に動く!
      Goの標準ライブラリがとても充実しており、追加のパッケージをインストールせずにWebサーバを作れたのは驚きでした。
    • シンプルで読みやすい
      初めてでもコードがすぐに理解できました。特に、エラー処理がわかりやすい点が初心者にはありがたいです。
    • VSCodeとの相性が良い
      VSCodeのGo拡張機能を使えば、コード補完やエラー表示があり快適に開発できました。

    これからの展望

    Go言語は軽量なWebサーバやツールを作成するのに向いていると感じました。次は以下のようなプロジェクトに挑戦してみたいです:

    • APIの開発
      REST APIを構築してデータを操作するアプリケーションを作りたい。
    • 並行処理
      Goならではの特徴である goroutine を活用してみたい。

    まとめ

    初めてのGo言語体験は、とても楽しいものでした。「Hello World」から始まり、簡単なWebサーバまで作ることができたことで、Go言語のシンプルさと強力さを実感しました。これからもっとGoを学び、いろいろなプロジェクトに挑戦していきたいと思います!