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

Golang で Google ドライブ ダウンローダーを構築する (パート 1)

Sep 30, 2024 am 06:24 AM

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 までご連絡ください。

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

ゴーを始めましょう:初心者のガイド ゴーを始めましょう:初心者のガイド Apr 26, 2025 am 12:21 AM

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golang vs. C:パフォーマンスと速度の比較 Golang vs. C:パフォーマンスと速度の比較 Apr 21, 2025 am 12:13 AM

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

See all articles