検索
ホームページバックエンド開発GolangGolang で Google ドライブ ダウンローダーを構築する (パート 1)

Building a Google Drive Downloader in Golang (Part 1)

介紹

在本教程中,我們將建立一個功能強大的下載器,允許從 Google Drive 和其他雲端提供者下載檔案。借助 Golang 高效的並發模式,您將能夠同時管理多個下載、串流大檔案並即時追蹤進度。無論您是下載一些小檔案還是處理大型資料集,該專案都將展示如何建立可擴展且強大的下載器,該下載器可以輕鬆擴展以支援多個雲端平台。

如果您正在尋找一種簡化和自動下載大檔案的方法,本教學非常適合您。最後,您將擁有一個靈活且可自訂的基於 Go 的下載器來滿足您的需求。

匆忙?

如果您只是想在 UI 中使用此下載器,請訪問 evolvasdev.com 閱讀完整文章和 Go Downloader 的 Github。您將找到讓它快速運行的文件。

你將學到什麼

  • Go 並發模式:
    了解如何使用 Goroutines、通道和互斥體來有效處理多個並發檔案下載。

  • 串流大量下載:
    探索如何在有效管理記憶體和系統資源的同時傳輸大檔案。

  • 並發檔案下載:
    了解如何同時下載文件,加快進程並提高效能。

  • 即時進度更新:
    實施進度追蹤以提供下載狀態的即時回饋。

  • 處理中斷與取消:
    了解如何優雅地取消一項或所有正在進行的下載。

注意:本教學只專注於核心下載邏輯。

環境設定

在做任何事情之前,請先確保正確設定您的環境,以避免將來出現潛在的錯誤。

先決條件

  • 安裝Go
  • AIR 用來自動重新載入
  • Makefile 執行複雜指令
  • Goose 用於 PostgreSQL 遷移

配置Makefile

使用下列內容在專案的根目錄中建立一個 makefile。

# Load environment variables from .env file
include ./.env

# To run the application
run: build
    @./bin/go-downloader

# Build the application
build:
    @go build -tags '!dev' -o bin/go-downloader

# Database migration status
db-status:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) status

# Run database migrations
up:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) up

# Roll back the last database migration
down:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) down

# Reset database migrations
reset:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) reset

進階資料夾結構概述

go-downloader/
├── api
├── config
├── migrations
├── service
├── setting
├── store
├── types
├── util
├── .env
├── .air.toml
├── Makefile
├── go.mod
├── go.sum
└── main.go

設定環境變數

根據需要在根目錄中建立 .env 檔案或處理環境變量,我們將使用 joho/godotenv 套件。

GOOGLE_CLIENT_ID
GOOGLE_CLIENT_SECRET
SESSION_SECRET=something-super-secret
APP_URL=http://localhost:3000
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_DB

建立網頁伺服器

我們現在將開始建立 Web 伺服器來處理所有傳入請求。

注意! 本指南的主要部分從這裡開始。準備好潛入水中吧!

API層

首先,在 api 資料夾 api.go 和 Route.go 中建立以下檔案

Route.go 檔案設定

所有API 路由 都將在此定義。我們建立一個採用 env 配置的 NewRouter 結構,讓所有路由和處理程序存取環境變數。

package api

import (
    "github.com/gofiber/fiber/v2"
    "github.com/nilotpaul/go-downloader/config"
)

type Router struct {
    env       config.EnvConfig
}

func NewRouter(env config.EnvConfig) *Router {
    return &Router{
        env:      env,
    }
}

func (h *Router) RegisterRoutes(r fiber.Router) {
    r.Get("/healthcheck", func(c *fiber.Ctx) error {
        return c.JSON("OK")
    })
}

api.go 檔案設定

在這裡,我們將在啟動伺服器之前添加所有必要的中間件,例如 CORS 和日誌記錄。

type APIServer struct {
    listenAddr string
    env        config.EnvConfig
}

func NewAPIServer(listenAddr string, env config.EnvConfig) *APIServer {
    return &APIServer{
        listenAddr: listenAddr,
        env:        env,
    }
}

func (s *APIServer) Start() error {
    app := fiber.New(fiber.Config{
        AppName:      "Go Downloader",
    })

    handler := NewRouter()
    handler.RegisterRoutes(app)

    log.Printf("Server started on http://localhost:%s", s.listenAddr)

    return app.Listen(":" + s.listenAddr)
}

主入口點

這是 main.go 檔案中的主包,它將作為整體的入口點。

func main() {
    // Loads all Env vars from .env file.
    env := config.MustLoadEnv()

    log.Fatal(s.Start())
}

這足以啟動伺服器並測試它。

啟動伺服器

air

就這樣了。 ?

測試

curl http://localhost:3000/healthcheck

反應應該正常,狀態為 200

建立提供者商店

我們需要實施一個可擴展的解決方案,以便在必要時添加對多個雲端供應商的支援。

從事提供者註冊工作

// Better to keep it in a seperate folder.
// Specific only to OAuth Providers.
type OAuthProvider interface {
    Authenticate(string) error
    GetAccessToken() string
    GetRefreshToken() string
    RefreshToken(*fiber.Ctx, string, bool) (*oauth2.Token, error)
    IsTokenValid() bool
    GetAuthURL(state string) string
    CreateOrUpdateAccount() (string, error)
    CreateSession(c *fiber.Ctx, userID string) error
    UpdateTokens(*GoogleAccount) error
}

type ProviderRegistry struct {
    Providers map[string]OAuthProvider
}

func NewProviderRegistry() *ProviderRegistry {
    return &ProviderRegistry{
        Providers: make(map[string]OAuthProvider),
    }
}

func (r *ProviderRegistry) Register(providerName string, p OAuthProvider) {
    r.Providers[providerName] = p
}

func (r *ProviderRegistry) GetProvider(providerName string) (OAuthProvider, error) {
    p, exists := r.Providers[providerName]
    if !exists {
        return nil, fmt.Errorf("Provider not found")
    }

    return p, nil
}

ProviderRegistry 充當中央映射來保存我們所有的 OAuth 提供者。當我們初始化我們的提供者時,我們將在這個映射中註冊它們。這使我們能夠在整個服務過程中輕鬆存取任何註冊提供者的功能。

稍後您會看到此操作。

初始化提供者存儲

我們將根據提供的環境變數註冊我們的提供者。

func InitStore(env config.EnvConfig) *ProviderRegistry {
    r := NewProviderRegistry()

    if len(env.GoogleClientSecret) != 0 || len(env.GoogleClientID) != 0 {
        googleProvider := NewGoogleProvider(googleProviderConfig{
            googleClientID:     env.GoogleClientID,
            googleClientSecret: env.GoogleClientSecret,
            googleRedirectURL:  env.AppURL + "/callback/google",
        }, env)

        r.Register("google", googleProvider)
    }

    return r
}

在這裡閱讀全文。

まとめ

私たちは Go の Google ドライブ ダウンローダー の基礎を築き、プロジェクト構造のセットアップ、Google OAuth の処理、将来の拡張のための基盤の構築などの主要なコンポーネントをカバーしました。その過程で、いくつかの重要なトピックについて触れました:

  • Goose を使用した データベース移行により、スムーズでスケーラブルなデータ管理を実現します。
  • 将来追加のクラウド ストレージ プロバイダーのサポートを簡単に拡張できるように、プロバイダー レジストリを構築します。
  • 将来的により複雑なロジックを簡単に処理できる柔軟なアーキテクチャを設計します。

かなり長くなってしまったので、1 つの投稿にはこれで十分です。 パート 2 に戻って作業を完了し、主なダウンロード機能を作業します。

それまでは、GitHub で現在の実装を自由に探索し、次のステップに注目してください。ダウンロードを楽しんでください!

以上がGolang で Google ドライブ ダウンローダーを構築する (パート 1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
GOの文字列操作:「文字列」パッケージのマスタリングGOの文字列操作:「文字列」パッケージのマスタリングMay 14, 2025 am 12:19 AM

GO言語で文字列パッケージをマスターすると、テキスト処理機能と開発効率が向上します。 1)コンテナ機能を使用してサブストリングを確認し、2)インデックス関数を使用してサブストリング位置を見つけ、3)関数を効率的にスプライスストリングスライス、4)機能を置き換えてサブストリングを置き換えます。空の文字列や大きな文字列操作のパフォーマンスの問題をチェックしないなど、一般的なエラーを避けるように注意してください。

「文字列」パッケージのヒントとトリックに移動します「文字列」パッケージのヒントとトリックに移動しますMay 14, 2025 am 12:18 AM

文字列の操作を簡素化し、コードをより明確かつ効率的にすることができるため、GOの文字列パッケージを気にする必要があります。 1)文字列を使用して、弦を効率的にスプライスするために参加します。 2)文字列を使用して、空白の文字で文字列を分割します。 3)文字列を介してサブストリング位置を見つけます。Indexと文字列lastindex; 4)文字列を使用して、文字列を置き換える。 5)文字列を使用して、ビルダーを効率的にスプライスします。 6)予期しない結果を避けるために、常に入力を確認してください。

Goの「文字列」パッケージ:文字列操作のためのあなたの頼みGoの「文字列」パッケージ:文字列操作のためのあなたの頼みMay 14, 2025 am 12:17 AM

theStringspackageIngoisESSENTINEFOREFFSTRINGMANIPULATION.1)ITOFFERSSSIMPLEYETPOWERFULFUNCTIONS FORTOSSCHECKINGSUBSTRINGSNINGSTRINGS.2)ITHANDLESUNICODEWELL、ITHANDLESUNICODEWELL

BYTESパッケージと文字列パッケージに移動します:どちらを使用すればよいですか?BYTESパッケージと文字列パッケージに移動します:どちらを使用すればよいですか?May 14, 2025 am 12:12 AM

whendeciding botedego'sbytespackageandstringspackage、usebytes.bufferbinarydataandstrings.builderforstringoperations.1)usebytes.bufferforkithbyteslices、binarydata、appendingdatatypes、およびwritioio.writioio.writioio.writioio.writioio.

「文字列」パッケージを使用して、ステップバイステップで文字列を操作する方法「文字列」パッケージを使用して、ステップバイステップで文字列を操作する方法May 13, 2025 am 12:12 AM

Goの文字列パッケージは、さまざまな文字列操作機能を提供します。 1)文字列を使用して、サブストリングを確認します。 2)文字列を使用して、ストリングをサブストリングスライスに分割します。 3)文字列を通して文字列をマージします。 4)文字列または文字列を使用して、文字列の最初と端でブランクまたは指定された文字を削除します。 5)指定されたすべてのサブストリングを文字列に置き換えます。ReplaceAll。 6)文字列を使用して、hasprefixまたは文字列hassuffixを使用して、文字列の接頭辞または接尾辞を確認します。

文字列パッケージに行く:私のコードを改善する方法は?文字列パッケージに行く:私のコードを改善する方法は?May 13, 2025 am 12:10 AM

GO言語文字列パッケージを使用すると、コードの品質が向上します。 1)文字列を使用して()join()を使用して、パフォーマンスのオーバーヘッドを避けるために、文字列アレイをエレガントに接続します。 2)strings.split()とstrings.contains()を組み合わせて、テキストを処理し、ケースの感度の問題に注意を払います。 3)文字列の乱用を避け、replace()を回避し、多数の置換に正規表現を使用することを検討します。 4)文字列を使用して、ビルダーを使用して、頻繁にスプライシング文字列の性能を向上させます。

GO BYTESパッケージで最も有用な機能は何ですか?GO BYTESパッケージで最も有用な機能は何ですか?May 13, 2025 am 12:09 AM

GoのBYTESパッケージは、バイトスライスを処理するためのさまざまな実用的な機能を提供します。 1.bites.containsは、バイトスライスに特定のシーケンスが含まれているかどうかを確認するために使用されます。 2.bites.splitは、バイトスライスをスモールピースに分割するために使用されます。 3.bites.joinは、複数のバイトスライスを1つに連結するために使用されます。 4.bites.trimspaceは、バイトスライスのフロントブランクとバックブランクを削除するために使用されます。 5.バイト。エクアルは、2つのバイトスライスが等しいかどうかを比較するために使用されます。 6.bytes.indexは、大規模なスライスでサブスライスの開始インデックスを見つけるために使用されます。

Goの「エンコーディング/バイナリ」パッケージを使用したバイナリデータ処理の習得:包括的なガイドGoの「エンコーディング/バイナリ」パッケージを使用したバイナリデータ処理の習得:包括的なガイドMay 13, 2025 am 12:07 AM

エンコード/binaryPackageIngoisESSENTINESTENTINESTINESTIDANDARDIZEDWAIDTOREADANDWRITEBINIRYDATA、クロスプラットフォームコンパティビティアンドハンドリングの可能性を確保することを確認します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。