Go 웹 기초 1
6741 단어 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Golang과 DB를 연결하여 주가 데이터를 그래프로 표시합니다.진화 제작된 프로그램. 지난번에 한 품종에 집중되어 데이터를 보였는데, 이번에는 텍스트 상자에 입력한 품종 코드를 바탕으로 나는 도표를 표시하는 기능을 만들고 싶다. html에서 텍스트 상자와 단추를 준비하세요. w...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.