[7days-golang-gee] gee-web-day1 fmt占位符,interface的类型转换,URI和URL的区别,map类型使用,struct初始化


学习材料:https://geektutu.com/post/gee-day1.html

一、fmt格式化输出和占位符

https://pkg.go.dev/fmt
fmt.Fprintln使用默认的%v

fmt.Fprintln(w, http.StatusText(http.StatusNotFound))

fmt.Fprintf使用占位符%s

fmt.Fprintf(w, "hello\n%s", http.StatusText(http.StatusOK))

二、interface的强制类型转换

在这里插入图片描述
在这里插入图片描述
定义一个struct Engine,Engine的成员函数func (egine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request),实现了interface Handler中的ServeHTTP。在使用ListenAndServe时,满足interface Handler要求的Engine实例可以直接传入参数,自动转换为interface Handler类型。

家用电器需要用电,规定通用的插座口(二插头/三插头——interface Handler中的ServeHTTP),不关心家电运作起来是什么样子的(Engine中的ServeHTTP的功能),只关心家电是否实现了对应的二插头/三插头(Engine中是否实现了`ServeHTTP),来达到通电的目的。

package main

import (
	"fmt"
	"log"
	"net/http"
)

// 定义一个handler
type Engine struct {
}

func (egine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
}
func main() {
	egine := new(Engine)
	log.Fatal(http.ListenAndServe(":9999", egine))
}

三、URI和URL的区别

访问 localhost:9999/hello?page=1
req.URL.Path只是/hello
req.URL.RequestURI()包括查询参数/hello?page=1

func (egine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	// 访问 localhost:9999/hello?page=1, 会输出/hello?page=1,可以看出和Path的区别
	fmt.Println(req.URL.RequestURI())
	URL := req.URL.Path
}

四、map类型使用

# ok 判断元素是否存在
if handler, ok := engine.router[key]; ok {
	handler(w, req)
} else {
	fmt.Fprintf(w, "404 NOT FOUND: %s\n", req.URL)
}

五、struct实例化

键值对的方式实例化,初始化参数

type Engine struct {
	router Router
}
func New() *Engine {
	return &Engine{router: make(map[string]HandlerContext)}
}
type Context struct {
	ResponseWriter http.ResponseWriter
	Request        *http.Request
	Path           string
}
c := &Context{Request: req, ResponseWriter: w, Path: req.URL.Path}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值