Go 웹 기초 1

6741 단어 Go
Go 에서 웹 개발 을 하 는 것 은 매우 빠 르 고 편리 합 니 다. 패키지 가 비교적 좋 고 Go 언어 가 타고 난 동시성 때문에 우 리 는 동시성 이 좋 은 서버 를 개발 하 는 것 이 쉽 습 니 다.저도 Go 언어 를 배우 기 시 작 했 습 니 다. 이 글 은 바로 학습 노트 입 니 다. 수준 이 매우 낮 고 잘못된 점 이 있 으 니 여러분 께 서 지적 해 주 십시오!
1. 가장 쉬 운 버 전:
package main

import (
	"net/http"
)

func main() {
	http.HandleFunc("/", sayHello)
	http.ListenAndServe(":8080", nil)
}
func sayHello(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello world"))
}

이것 은 기본 적 인 것 입 니 다. 작은 의문 이 있 습 니 다. 바로 sayHello 함수 중의 매개 변수 입 니 다. 두 번 째 는 지침 이 고 첫 번 째 는 아 닙 니 다.홈 페이지 를 보면 type Response Writer interface 와 type Request struct 의 차이 점 을 발견 할 수 있 습 니 다. 구조 체 는 당연히 지침 을 사용 해 야 합 니 다. 복사 에 따 른 비용 을 줄 여야 합 니 다.인 터 페 이 스 는 왜 이렇게 지침 유형 을 사용 하지 않 습 니까? 제 이 해 는 "지침 유형 을 사용 하고 이 인 터 페 이 스 를 실현 하 는 것 이 구조의 지침 이 라면 지침 의 지침 이 고 일반적으로 인 터 페 이 스 를 실현 하 는 것 은 구조의 지침 입 니 다." 물론 이 이 해 는 잘못된 것 일 수 있 습 니 다. 이 프로그램 에서 먼저 handle Func 를 사용 합 니 다.() 경로 설정 을 한 다음 감청 포트 입 니 다. func HandleFunc (pattern string, handler func (ResponseWriter, * Request) 와 func ListenAndServe (addr string, handler Handler) error 두 함수 의 API 입 니 다. type Handler interface {ServeHTTP (ResponseWriter, * Request)}이 함수 의 두 번 째 매개 변 수 는 인터페이스 입 니 다. 이제 HandleFunc () 함수 의 원본 코드 를 살 펴 보 겠 습 니 다.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

원래 이 함 수 는 ServerMux 의 Handle Func 방법 을 호출 한 것 이 었 습 니 다.
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    if handler == nil {
        panic("http: nil handler")
    }
    mux.Handle(pattern, HandlerFunc(handler))
}

Handler Func (handler) 는 handler 를 Handler Func 형식 으로 바 꿨 을 뿐 입 니 다. type Handler Func func (Response Writer, * Request) 는 정의 입 니 다. 그러면 조금 더 깊이 들 어가 서 Handle 함수 로 해 보 겠 습 니 다.
2. 조금 더 깊이:
우 리 는 등록 경로 의 함수 중 하 나 는 func Handle (pattern string, handler Handler) 이 고 두 번 째 매개 변 수 는 인터페이스 입 니 다. 이 인 터 페 이 스 는 ServeHTTP (Response Writer, * Request) 함수 의 인 터 페 이 스 를 실현 합 니 다. 우 리 는 이 함수 로 하 나 를 만 듭 니 다.
package main

import (
	"net/http"
)

type myHandle struct {
}

func main() {
	http.Handle("/", &myHandle{})
	http.ListenAndServe(":8080", nil)
}
func (*myHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello world2"))
}

API 를 통 해 우 리 는 ListenAndServe () 함수 의 두 번 째 매개 변수 도 handle 인터페이스 라 는 것 을 알 게 되 었 습 니 다. 그러면 이 handle 도 사용자 정의 실현 인터페이스 입 니까? 아 닙 니 다. API 를 통 해 'The handler is typically nil, in which case the Default ServeMux is used."원래 여기 서 handle 인 터 페 이 스 를 실현 하 는 구조 체 는 이미 규범 이 있 습 니 다. ServerMux 입 니 다. 이 ServerMux 는 어떤 유형 입 니까?"
type ServeMux struct { // contains filtered or unexported fields }

구조 체 의 의 미 를 가 진 구조 체 입 니 다. "ServeMux 는 HTTP 요청 다 중 재 활용 기 입 니 다. 요청 한 URL 을 등 록 된 모드 의 목록 과 일치 시 키 고 URL 과 가장 일치 하 는 모드 의 처리 프로그램 을 호출 합 니 다." 이것 은 API 의 프로필 입 니 다. 그러면 ServerMux 를 통 해 경로 등록 등 을 할 수 있 습 니 다. func (mux * ServeMux) 를 선택 할 수 있 습 니 다.HandleFunc (pattern string, handler func (ResponseWriter, * Request)) 방법 으로 경로 등록 을 진행 합 니 다.
package main

import (
	"net/http"
)

func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/", sayHello)
	http.ListenAndServe(":8080", mux)
}
func sayHello(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello world3"))
}

위 에는 이미 Handle 함수 로 구현 되 었 습 니 다. Handle 함수 의 원본 코드 를 다시 봅 니 다.
func (mux *ServeMux) Handle(pattern string, handler Handler) {
    mux.mu.Lock()
    defer mux.mu.Unlock()

    if pattern == "" {
        panic("http: invalid pattern")
    }
    if handler == nil {
        panic("http: nil handler")
    }
    if _, exist := mux.m[pattern]; exist {
        panic("http: multiple registrations for " + pattern)
    }

    if mux.m == nil {
        mux.m = make(map[string]muxEntry)
    }
    mux.m[pattern] = muxEntry{h: handler, pattern: pattern}

    if pattern[0] != '/' {
        mux.hosts = true
    }
}

우 리 는 그것 이 ServeMux 구 조 를 이용 하여 조작 한 것 을 발견 했다.
type ServeMux struct {
        mu    sync.RWMutex
        m     map[string]muxEntry
        hosts bool // whether any patterns contain hostnames
    }

type muxEntry struct {
        explicit bool
        h        Handler
        pattern  string
    }

사실, 우 리 는 스스로 맵 을 정의 하여 이러한 매 칭 을 실현 할 수 있 습 니 다.
3. 조금 더 깊이:
현재 사용자 정의 server, server 의 API 에 대한 정 의 를 진행 합 니 다.
type Server struct {
    Addr    string  // TCP address to listen on, ":http" if empty
    Handler Handler // handler to invoke, http.DefaultServeMux if nil
    TLSConfig *tls.Config
    ReadTimeout time.Duration
    ReadHeaderTimeout time.Duration  
    WriteTimeout time.Duration  
    IdleTimeout time.Duration 
    MaxHeaderBytes int
    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
    ConnState func(net.Conn, ConnState)
    ErrorLog *log.Logger
   
}

이런 형식의 코드 는 다음 과 같다.
package main

import (
	"net/http"
	"time"
)

var mux map[string]func(http.ResponseWriter, *http.Request)

func main() {
	server := http.Server{
		Addr:        ":8080",
		Handler:     &myHandle{},
		ReadTimeout: 10 * time.Second,
	}
	mux = make(map[string]func(http.ResponseWriter, *http.Request))
	mux["/hello"] = sayHello
	server.ListenAndServe()
}

type myHandle struct{}

func (*myHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if h, ok := mux[r.URL.String()]; ok {
		h(w, r)
		return
	}
	w.Write([]byte("others"))
}

func sayHello(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello world 4"))
}

코드 가 비교적 간단 하고 설명 할 것 도 없다.
이상 의 세 가지 형식의 웹 간단 한 코드 입 니 다. 오류 가 있 으 면 지적 해 주 십시오. 성명: 상기 코드 는 오류 처 리 를 하지 않 고 간단 한 프 리 젠 테 이 션 일 뿐 입 니 다. Go 언어 에 관 한 편리 한 API 조회 사 이 트 를 공유 합 니 다.https://gowalker.org/net/http#Server
참조 링크: 1. interface 에 대한 설명:https://mp.weixin.qq.com/s?__biz=MzA4NzAzMjk4Mw==&mid=2247483733&idx=1&sn=9ef6e26c334599c0074a3fbe262d3a1b&chksm=903ed4ada7495dbbc3b4ec6feccf419cb2df9389b3227a45c6f1c8c350d033ba7960339b89da&mpshare=1&scene=1&srcid=0723EcpTK2GWJAONVQ1GTwJj&key=dc7dfb672b5ac5a823e8c1c3404c26554179516a85f2dee9e2935c8aa6055f0bc3847dd9510f02aa1d1802bbe8b76f16776318eda060969e8fa2e439756b7bceed9fd13c4042251dc9e406fed3c13951&ascene=0&uin=OTUyMjY5NDgw&devicetype=iMac%20MacBookPro11,5%20OSX%20OSX%2010.11.6%20build(15G1004)&version=12

좋은 웹페이지 즐겨찾기