路由基礎net/http的學習
===
有tp或者其他web基礎的同學都知道路由這東西吧,
你看現在路由器的地址欄上的http://.....這些就路由
每一個路由對應不同的頁面
好的我們現在就來寫吧
*****
1.基礎準備,配置golang 環境這些我就不必多說了吧
2.我們本次開發用到的IDE為golang這個安裝和新建一個項目,我也不必多說了吧
3.新建一個main.go
```
package main
import (
"fmt"
"net/http"
)
func main() {
/*
這個是創建一個路由 路由地址 /hello
接收兩個參數 第一個為response 第二個是request
(注:request 為什么是指針? 這個golang默認是值傳遞,如果你寫 request http.Request 這樣接收的參數是傳遞的副本拷貝的 這個是golang基礎不懂的話去看官方文檔啊~!)
writer.Write() response返回 要求是[]byte so你要轉一下
好的 現在編譯一下吧 運行下吧
go build .
然和通過瀏覽器 訪問 http://127.0.0.1:8085/hello
*/
// url: http://127.0.0.1:8085/hello
http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("Hello GOlang"))
})
fmt.Println("server is runing ...")
err := http.ListenAndServe(":8085", nil) //第一個是地址(ip:端口 ip可以省略 監聽本機全部端口) 第二個是handler
if err != nil {
fmt.Println("server error:",err.Error())
}
}
```

哈哈golang寫網頁是不是非常簡單的 如果對上面幾個方法有不懂的地方
去官網看看golang net/http的庫
### httprouter講解
好了大家現在發現沒有 第一章我讓大家去了解下RESTful api
剛剛上面的例子 get post .. 都可以請求到
現在我就給大家講一個httproter 庫 為net/http的升級版
大家應該聽過大名鼎鼎的git框架吧 他的路由實現就是靠 httproter實現的
1.第一步獲得httproter
```
go get github.com/julienschmidt/httprouter
```
(還是推薦使用vgo做管理,有想法的同學可以去看看蛤)
現在我們已經獲取了,現在就來改造一下我們的demo吧
等等剛剛還忘了說一個問題,如果所有的路由都在main方法里面寫,最后來main是不是非常的大啊!
好的,現在我們就來用httproter順便解決這個問題吧
```
package main
import (
"fmt"
"github.com/julienschmidt/httprouter"
"net/http"
)
/**
創建路由注冊
*/
func RegisterRouter() *httprouter.Router {
router := httprouter.New() //得到router實例
//注冊路由
// 路由后面可以跟.GET .POST .DELETE .PUT 等 (其他的怎么查看呢? 你按住ctrl 點贊 New()進入方法 看下面的代碼 里面就是詳情啊!)
// 第一個你發覺參數有些不同的嗎? 對 多了一個params httprouter.Params 這個用來接收路由中的參數 等會來講
// 我們先看GET POST都指向同一個路徑 but返回不同的內容, 怎么測試呢? 百度postman 這個是測試基礎啊!百度學習吧騷年 非常簡單的
router.GET("/", func(writer http.ResponseWriter, request *http.Request, params httprouter.Params) {
writer.Write([]byte("this is get method"))
})
router.POST("/", func(writer http.ResponseWriter, request *http.Request, params httprouter.Params) {
writer.Write([]byte("this is post method"))
})
return router
}
func main() {
router := RegisterRouter() //注冊路由
fmt.Println("server is runing ...")
//這里發現改變了什么嗎?
//對第二次參數變成了router
err := http.ListenAndServe(":8085", router) //第一個是地址(ip:端口 ip可以省略 監聽本機全部端口) 第二個是handler
if err != nil {
fmt.Println("server error:",err.Error())
}
}
```
好了我們再來看params httprouter.Params是什么東西,順便解決吧路由分開
1.創建router文件夾
2.在里面方兩個文件一個是router.go 一個handlers.go
├── main.go
├── router 路由層
│?? ├── handlers.go
│?? └── router.go
這樣就完成了分離 是不是好看了許多啊!

是不是很簡單啊
我現在就吧當前的代碼提交了吧,我去的github上看看吧,記住自己要練習啊!
[https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B7%AF%E7%94%B1%E5%9F%BA%E7%A1%80](https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B7%AF%E7%94%B1%E5%9F%BA%E7%A1%80)
- 初認GOlang Web
- 關于環境配置
- 路由
- 路由進階與目錄架構
- 靜態文件服務器
- 自定義Middleware
- 與MySQL起舞
- 主從模式概念
- 部署主從集群
- 分庫分表
- 補充:事務
- 補充:常用SQL示例
- Template使用
- 一些小的,但是要知道的東西
- 調度任務
- 流控算法
- 鑒權
- JWT鑒權前置知識:加密解密
- session
- 文件上傳與下載
- 帶緩存讀寫拷貝io
- 參考
- 寫好的文件上傳
- 文件下載
- 拓展:秒傳功能實現
- 擴展:分塊上傳和斷點續傳
- 擴展:分塊上傳
- 擴展:斷點續傳
- 擴展:分布式存儲
- 部署ceph集群
- cephAuth
- go操作ceph集群
- 擴展:云存儲
- go操作oss
- 補充:xorm框架
- 命令小結
- 補充:xorm框架高級部分
- 補充
- MongoDB
- 基礎概念
- 簡簡單單NoSql
- 操作集合(Collection)
- 操作文檔(Document)
- 帶條件的文檔 db.find
- 復雜條件抽文檔 db.find
- redis
- redis操作
- go操作redis
- (新增)配置鑒權
- 密碼學
- 文件校驗算法
- 未來課程的安排
- RPC實踐
- 爬蟲
- 正則表達式
- 爬取手機號
- 爬取郵箱
- 爬取超鏈接
- 爬取身份證號
- 并發爬圖片
- 擴展:CICD
- GO實現自動化部署系統
- 國際化支持
- 并發帶來問題的解決
- GOWEB小知識
- Sync包講解
- sync.Pool
- 千萬級WebSocket消息推送
- 微服務入門:開篇
- 路由通訊
- RabbitMQ
- RabbitMQ工作原理和轉發模式
- Dcoker 下 RabbitMQ and Ui
- Go操作RabbitMQ
- 初步微服務
- go-micro
- 補充:consul
- 快速入門
- 補充:consul超時
- 微服務架構
- 微服務架構全景圖
- 服務注冊和發現
- raft協議基本概念
- raft協議leader選舉詳解
- raft協議日志復制詳解
- raft協議safefy詳解
- rpc調用個服務監控
- etcd
- 命令行使用
- Golang操作etcd
- GO操作etcd OP方式 (分布式鎖基礎)
- etcd 分布式集群樂觀鎖
- (新增)鑒權
- 服務注冊
- 服務發現原理
- 選項設計模式介紹
- 基于插件的注冊組建
- 課前知識
- etcd注冊開發1
- ffmpeg
- 2.0新的啟航
- 高可用Mysql
- mysql邏輯架構
- 常見的MySQL高可用方案
- 索引
- MYSQL調優
- 什么影響了MYSQL的性能
- Mysql 服務器參數配置
- Go深入并發
- 基本同步原語
- 擴展同步原語
- 原子操作
- M P G 模型
- 簡單的消息總線
- GoMicro入門
- GO任務池編寫
- GO依賴注入
- 一些補充
- golang defer在什么時候執行
- 分布式理論篇(面試吹牛必備)
- CAP理論
- Raft協議
- 保證注冊中心的可靠性
- 鏈路追蹤
- 怎么實現強一致性