ホームページ >バックエンド開発 >Golang >golang が MVC アーキテクチャを実装する方法

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

PHPz
PHPzオリジナル
2023-04-06 09:10:581039ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。