golang が MVC アーキテクチャを実装する方法

PHPz
リリース: 2023-04-06 11:06:41
オリジナル
997 人が閲覧しました

MVC (モデル ビュー コントローラー) は、アプリケーションを 3 つのコア部分 (モデル、ビュー、コントローラー) に分割する、一般的に使用されるソフトウェア アーキテクチャ パターンです。この分離により、アプリケーションの保守性、拡張性、再利用性が向上します。 Golang では、MVC アーキテクチャを簡単に実装できます。

1. MVC の概要

1.1 モデル

モデル層はアプリケーションの中核部分であり、主にデータ関連の操作の処理を担当します。モデル層には次のコンテンツを含めることができます。

1.1.1 データベース接続

モデル層の主な仕事は、データベースと対話することです。 Golang では、公式に提供されているデータベース/SQL ライブラリを使用してリレーショナル データベースに接続できます。例:

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(host:port)/dbname")
    // ...
}
ログイン後にコピー

1.1.2 データベース操作

データベース/SQL ライブラリを通じて、さまざまなデータベース操作を実行できます。たとえば、データベース内のテーブルをクエリします。

rows, err := db.Query("SELECT * FROM users")
defer rows.Close()
for rows.Next() {
    var id int
    var username string
    var password string
    err := rows.Scan(&id, &username, &password)
    // ...
}
ログイン後にコピー

1.2 View

View レイヤーは、データ (通常は HTML ページ) を表示する役割を果たします。 Golang では、HTML テンプレート エンジンを使用して View レイヤーを構築できます。例:

import (
    "html/template"
)

type User struct {
    Username string
    Password string
}

func main() {
    tpl := template.Must(template.ParseFiles("template.html"))
    user := User{
        Username: "user",
        Password: "password",
    }
    tpl.Execute(w, user)
}
ログイン後にコピー

1.3 コントローラー

コントローラー層は、ユーザーのリクエストを処理し、リクエストをモデル層とビュー層に転送する役割を果たします。 Golang では、HTTP ルーターを使用してコントローラー層の機能を実装できます。例:

import (
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // 处理用户请求
    // ...
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
ログイン後にコピー

2. Golang は MVC

2.1 モデル層を実装します

Golang では、struct を使用してモデル層のデータ構造を定義できます。次に例を示します。

type User struct {
    ID       int
    Username string
    Password string
}
ログイン後にコピー

例:

type UserRepository interface {
    FindByID(id int) (*User, error)
    FindAll() ([]*User, error)
    Store(user *User) error
    Delete(id int) error
}
ログイン後にコピー

次に、UserRepository インターフェイスを実装することで、モデル層のメソッドを具体的に実装できます。例:

type UserRepositoryImpl struct {
    db *sql.DB
}

func NewUserRepository(db *sql.DB) *UserRepositoryImpl {
    return &UserRepositoryImpl{
        db: db,
    }
}

func (r *UserRepositoryImpl) FindByID(id int) (*User, error) {
    var user *User
    err := r.db.QueryRow("SELECT * FROM users WHERE id = ?", id).
        Scan(&user.ID, &user.Username, &user.Password)
    if err != nil {
        return nil, err
    }
    return user, nil
}

func (r *UserRepositoryImpl) FindAll() ([]*User, error) {
    var users []*User
    rows, err := r.db.Query("SELECT * FROM users")
    if err != nil {
        return nil, err
    }
    for rows.Next() {
        var user User
        err := rows.Scan(&user.ID, &user.Username, &user.Password)
        if err != nil {
            return nil, err
        }
        users = append(users, &user)
    }
    return users, nil
}

func (r *UserRepositoryImpl) Store(user *User) error {
    stmt, err := r.db.Prepare("INSERT INTO users (username, password) VALUES (?, ?)")
    if err != nil {
        return err
    }
    _, err = stmt.Exec(user.Username, user.Password)
    if err != nil {
        return err
    }
    return nil
}

func (r *UserRepositoryImpl) Delete(id int) error {
    stmt, err := r.db.Prepare("DELETE FROM users WHERE id = ?")
    if err != nil {
        return err
    }
    _, err = stmt.Exec(id)
    if err != nil {
        return err
    }
    return nil
}
ログイン後にコピー

2.2 ビュー レイヤー

Golang では、HTML テンプレート エンジンを使用してビュー レイヤーをレンダリングできます。例:

var tpl = `
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{.Title}}</title>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Username</th>
                <th>Password</th>
            </tr>
        </thead>
        <tbody>
            {{range $index, $user := .Users}}
            <tr>
                <td>{{$user.ID}}</td>
                <td>{{$user.Username}}</td>
                <td>{{$user.Password}}</td>
            </tr>
            {{end}}
        </tbody>
    </table>
</body>
</html>
`

type PageData struct {
    Title string
    Users []*User
}

func handler(w http.ResponseWriter, r *http.Request) {
    userRepository := NewUserRepository(db)
    users, err := userRepository.FindAll()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    data := PageData{
        Title: "Users",
        Users: users,
    }
    tpl := template.Must(template.New("index").Parse(tpl))
    err = tpl.Execute(w, data)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
ログイン後にコピー

2.3 コントローラー レイヤー

Golang では、HTTP ルーターを使用してユーザー リクエストを処理できます。例:

func handler(w http.ResponseWriter, r *http.Request) {
    // 处理用户请求
    // ...
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
ログイン後にコピー

また、gorilla/mux ライブラリを使用して高度なルーティング機能を実装することもできます。例:

func handler(w http.ResponseWriter, r *http.Request) {
    // 处理用户请求
    // ...
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", handler)
    r.HandleFunc("/users/{id}", getUser).Methods(http.MethodGet)
    http.ListenAndServe(":8080", r)
}

func getUser(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    id, _ := strconv.Atoi(vars["id"])
    userRepository := NewUserRepository(db)
    user, err := userRepository.FindByID(id)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    json.NewEncoder(w).Encode(user)
}
ログイン後にコピー

3. 結論

Golang で MVC アーキテクチャを実装することにより、アプリケーションのさまざまな部分を適切に分離し、保守性、拡張性、複雑性を向上させることができます。実装では、公式に提供されているデータベース/SQL ライブラリを使用してデータベースを操作し、HTML テンプレート エンジンを使用してページをレンダリングし、HTTP ルーターを使用してユーザー リクエストを処理できます。同時に、高度なルーティング機能を実装するためのゴリラ/マルチプレクサ ライブラリなど、サードパーティのライブラリを使用して高度な機能を実装することもできます。

以上がgolang が MVC アーキテクチャを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!