Rumah pembangunan bahagian belakang Golang golang melaksanakan rangka kerja web

golang melaksanakan rangka kerja web

May 12, 2023 pm 10:42 PM

Golang ialah bahasa pengaturcaraan yang sangat popular yang digemari oleh ramai pengaturcara kerana kecekapannya dan sokongan serentak yang berkuasa. Dalam bidang pembangunan web, aplikasi web berprestasi tinggi dan berskala tinggi boleh dibina dengan menggunakan Golang. Untuk membina aplikasi web dengan lebih mudah, pembangun biasanya menggunakan rangka kerja web Golang. Dalam artikel ini, kita akan membincangkan cara melaksanakan rangka kerja web mudah menggunakan Golang.

Melaksanakan rangka kerja web perlu menangani isu yang sangat penting: cara mengendalikan permintaan dan respons HTTP. Golang menyediakan perpustakaan standard yang sangat mudah untuk menangani masalah ini, pakej net/http. Memandangkan kami ingin mencipta rangka kerja, kami akan menggunakan perpustakaan standard ini untuk melaksanakan aplikasi web kami.

Pertama, kita perlu menentukan fungsi rangka kerja web kita. Kami ingin mencipta penghala ringkas yang boleh memetakan laluan URL yang diminta oleh pengguna kepada fungsi pengendali yang sepadan. Kami juga mahu menyokong perisian tengah untuk mengendalikan permintaan dan respons HTTP.

Sebelum mencipta rangka kerja web kami, kami terlebih dahulu perlu memahami beberapa konsep dan perpustakaan Golang yang biasa. Yang pertama ialah struktur (struct), iaitu jenis data yang ditentukan pengguna yang boleh digunakan untuk menyimpan satu set atribut berkaitan. Seterusnya datang fungsi, yang merupakan blok boleh laku kod yang menerima parameter dan mengembalikan nilai. Dalam Golang, fungsi juga boleh digunakan sebagai pembolehubah. Akhir sekali, terdapat antara muka, yang mentakrifkan satu set kaedah Sebarang jenis yang melaksanakan kaedah ini boleh dianggap sebagai melaksanakan antara muka. Antara muka boleh digunakan untuk memisahkan kod dan menjadikannya lebih fleksibel.

Dengan mengambil kira konsep asas ini, kami boleh mula membina rangka kerja web kami. Yang pertama ialah fungsi penghala. Kita boleh melaksanakan penghala dengan mencipta struktur Penghala. Struktur Penghala ini harus mempunyai fungsi berikut:

  • Dapat memetakan permintaan kepada fungsi pemprosesan yang sepadan berdasarkan laluan URL dan kaedah HTTP (GET, POST, dll.).
  • Dapat mengendalikan parameter dan mengembalikan nilai fungsi pengendali dan membungkusnya ke dalam http.HandlerFunc.
  • Perisian tengah yang mengendalikan penghala dan menggunakannya pada permintaan dan respons HTTP.

Berikut ialah struktur Penghala mudah yang boleh mencapai fungsi di atas:

type Router struct {
    routes       map[string]map[string]http.HandlerFunc
    middleware   []Middleware
}
Salin selepas log masuk

Dalam struktur ini, kami menggunakan peta bersarang untuk menyimpan penghalaan dan pemetaan fungsi pemprosesan antara. Kami boleh melaksanakan pemetaan dengan mudah dengan mempunyai laluan URL dan kaedah HTTP sebagai kunci peringkat pertama dan kedua. Harta middleware ialah tatasusunan Middleware yang menyimpan middleware yang digunakan pada permintaan dan respons HTTP.

Seterusnya, kita perlu melaksanakan kaedah untuk menambah penghalaan dan pemetaan fungsi pemprosesan:

func (router *Router) HandleFunc(method string, path string, handlerFunc http.HandlerFunc) {
    if _, ok := router.routes[method]; !ok {
        router.routes[method] = make(map[string]http.HandlerFunc)
    }
    router.routes[method][path] = handlerFunc
}
Salin selepas log masuk

Kaedah ini membungkus kaedah HTTP, laluan URL dan fungsi pemprosesan ke dalam jenis fungsi pemprosesan, dan Ia adalah ditambahkan pada jadual pemetaan penghala. Jika pemetaan belum dibuat untuk kaedah HTTP ini, kita perlu mencipta entri baharu dalam jadual pemetaan.

Seterusnya, kami perlu melaksanakan kaedah lain untuk mengendalikan permintaan dan respons HTTP. Kaedah ini perlu menyemak laluan URL yang diminta dan kaedah HTTP dan memetakannya ke fungsi pengendali yang sepadan. Jika pengendali yang sepadan tidak dijumpai, ralat 404 harus dikembalikan. Jika middleware wujud, ia harus dikendalikan. Akhirnya, fungsi pengendali dipanggil dan permintaan dan tindak balas diluluskan sebagai parameter.

func (router *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var handlerFunc http.HandlerFunc
    var exists bool

    if handlerFunc, exists = router.routes[r.Method][r.URL.Path]; !exists {
        http.NotFound(w, r)
        return
    }

    for _, middleware := range router.middleware {
        handlerFunc = middleware(handlerFunc)
    }

    handlerFunc(w, r)
}
Salin selepas log masuk

Kaedah ini menggunakan antara muka terbina dalam bahasa Go http.Handler untuk mengendalikan permintaan dan respons HTTP. Pustaka HTTP secara automatik menukarnya kepada http.ResponseWriter dan http.Request. Kami hanya perlu mengendalikannya seperti yang ditunjukkan dalam kod.

Akhir sekali, kita perlu melaksanakan kaedah untuk menambah perisian tengah. Kaedah ini akan membungkus lagi fungsi pengendali HTTP dan menggunakannya pada permintaan dan respons HTTP.

func (router *Router) Use(middleware Middleware) {
    router.middleware = append(router.middleware, middleware)
}
Salin selepas log masuk

Kini, kami telah berjaya mencipta rangka kerja web asas Golang. Kod lengkap adalah seperti berikut:

package main

import (
    "net/http"
)

type Middleware func(http.HandlerFunc) http.HandlerFunc

type Router struct {
    routes       map[string]map[string]http.HandlerFunc
    middleware   []Middleware
}

func NewRouter() *Router {
    return &Router{
        routes: make(map[string]map[string]http.HandlerFunc),
        middleware: []Middleware{},
    }
}

func (router *Router) HandleFunc(method string, path string, handlerFunc http.HandlerFunc) {
    if _, ok := router.routes[method]; !ok {
        router.routes[method] = make(map[string]http.HandlerFunc)
    }
    router.routes[method][path] = handlerFunc
}

func (router *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var handlerFunc http.HandlerFunc
    var exists bool

    if handlerFunc, exists = router.routes[r.Method][r.URL.Path]; !exists {
        http.NotFound(w, r)
        return
    }

    for _, middleware := range router.middleware {
        handlerFunc = middleware(handlerFunc)
    }

    handlerFunc(w, r)
}

func (router *Router) Use(middleware Middleware) {
    router.middleware = append(router.middleware, middleware)
}

func main() {
    router := NewRouter()

    router.HandleFunc(http.MethodGet, "/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, world!"))
    })

    router.Use(func(next http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            w.Header().Set("Content-Type", "application/json")
            next(w, r)
        }
    })

    http.ListenAndServe(":8000", router)
}
Salin selepas log masuk

Dalam kod ini, kami mula-mula mencipta fungsi yang dipanggil NewRouter untuk mencipta tika Router baharu. Seterusnya, kami menggunakan kaedah HandleFunc untuk menambah pemetaan fungsi penghalaan dan pemprosesan yang sepadan. Kemudian, tambah perisian tengah melalui kaedah Use. Akhir sekali, kami menggunakan fungsi ListenAndServe untuk memulakan pelayan HTTP.

Untuk menguji rangka kerja web kami, kami boleh menjalankan kod di atas dan kemudian masukkan alamat "localhost:8000" dalam penyemak imbas. Jika semuanya berjalan lancar, anda seharusnya melihat "Helo, dunia!" dan pengepala respons harus mengandungi atribut "Content-Type: application/json".

Dalam artikel ini, kami memperkenalkan cara menggunakan Golang untuk melaksanakan rangka kerja web dan menunjukkan kod sampel mudah. Walaupun rangka kerja contoh kami adalah sangat asas, kami boleh melanjutkannya dengan menambahkan lebih banyak ciri dan perisian tengah. Saya harap anda boleh belajar cara membina rangka kerja web anda sendiri di Golang melalui artikel ini.

Atas ialah kandungan terperinci golang melaksanakan rangka kerja web. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Mar 21, 2025 pm 06:37 PM

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Apakah kelemahan debian openssl Apakah kelemahan debian openssl Apr 02, 2025 am 07:30 AM

OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Artikel ini menunjukkan penciptaan dan stub di GO untuk ujian unit. Ia menekankan penggunaan antara muka, menyediakan contoh pelaksanaan mengejek, dan membincangkan amalan terbaik seperti menjaga mocks fokus dan menggunakan perpustakaan penegasan. Articl

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Artikel ini meneroka kekangan jenis adat Go untuk generik. Ia memperincikan bagaimana antara muka menentukan keperluan jenis minimum untuk fungsi generik, meningkatkan keselamatan jenis dan kebolehgunaan semula kod. Artikel ini juga membincangkan batasan dan amalan terbaik

Terangkan tujuan Pakej Refleksi Go. Bilakah anda akan menggunakan refleksi? Apakah implikasi prestasi? Terangkan tujuan Pakej Refleksi Go. Bilakah anda akan menggunakan refleksi? Apakah implikasi prestasi? Mar 25, 2025 am 11:17 AM

Artikel ini membincangkan pakej GO's Reflect, yang digunakan untuk manipulasi kod runtime, bermanfaat untuk siri, pengaturcaraan generik, dan banyak lagi. Ia memberi amaran tentang kos prestasi seperti pelaksanaan yang lebih perlahan dan penggunaan memori yang lebih tinggi, menasihati penggunaan yang bijak dan terbaik

Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO? Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO? Mar 21, 2025 pm 06:35 PM

Artikel ini membincangkan menggunakan ujian yang didorong oleh jadual di GO, satu kaedah yang menggunakan jadual kes ujian untuk menguji fungsi dengan pelbagai input dan hasil. Ia menyoroti faedah seperti kebolehbacaan yang lebih baik, penurunan duplikasi, skalabiliti, konsistensi, dan a

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Artikel ini meneroka menggunakan alat pengesanan untuk menganalisis aliran pelaksanaan aplikasi GO. Ia membincangkan teknik instrumentasi manual dan automatik, membandingkan alat seperti Jaeger, Zipkin, dan OpenTelemetry, dan menonjolkan visualisasi data yang berkesan

See all articles