è¿éåèªå®ä¹ç®å½æ é¢
- day10 课ä¸ç¬è®°
- å 容å顾
-
- MySQL
-
- database/sql
- ä½ä¸
- Redis
- NSQ
-
- nsqd
- nsqlookupd
- nsqadmin
- ä»æ¥å 容
-
- go module
- Ginæ¡æ¶
-
- ä¸è½½Ginæ¡æ¶
- Ginæ¡æ¶åºæ¬ç¤ºä¾
- RESTful API
- Ginæ¡æ¶ç渲æ
-
- JSON
- HTML
- XML
- YAML
- Protobuf
- åæ°è§£æ
-
- query string
- form param
- path param
- 书ç±ç®¡ççç»ä¹
-
-
-
- 书ç±çä¿¡æ¯
- Web页é¢çå¢å æ¹æ¥
-
- è·¯ç±è·³è½¬
-
- Ginè·¯ç±
-
- è·¯ç±çæ¹æ³
- è·¯ç±ç»
- è·¯ç±çåç
- Ginä¸ä¼ æ件
-
- ä¸ä¼ å个æ件
- ä¸ä¼ å¤ä¸ªæ件
-
- ä½ä¸
- æªæ¥å 容
- 欢è¿ä½¿ç¨Markdownç¼è¾å¨
-
- æ°çæ¹å
- åè½å¿«æ·é®
- åççå建æ é¢ï¼æå©äºç®å½ççæ
- å¦ä½æ¹åææ¬çæ ·å¼
- æå ¥é¾æ¥ä¸å¾ç
- å¦ä½æå ¥ä¸æ®µæ¼äº®ç代ç ç
- çæä¸ä¸ªéåä½ çå表
- å建ä¸ä¸ªè¡¨æ ¼
-
- 设å®å å®¹å± ä¸ãå± å·¦ãå± å³
- SmartyPants
- å建ä¸ä¸ªèªå®ä¹å表
- å¦ä½å建ä¸ä¸ªæ³¨è
- 注éä¹æ¯å¿ ä¸å¯å°ç
- KaTeXæ°å¦å ¬å¼
- æ°ççç¹å¾åè½ï¼ä¸°å¯ä½ çæç«
- UML å¾è¡¨
- FLowchartæµç¨å¾
- 导åºä¸å¯¼å ¥
-
- 导åº
- å¯¼å ¥
day10 课ä¸ç¬è®°
å 容å顾
MySQL
database/sql
驱å¨ï¼
// åªç¨å°äºå®è¿ä¸ªå
éé¢çinit()
import _ "github.com/go-sql-driver/mysql"
sqlx
è¿æ¥æ°æ®åº
â 设置æ大è¿æ¥æ°
â 设置æ大空é²è¿æ¥æ°
æ¥è¯¢åæ¡
æ¥è¯¢å¤æ¡
æ§è¡SQL
äºå¡
é¢å¤ç
ä½ä¸
create table userinfo(
id bigint(20) not null auto_increment,
username varchar(20) not null,
password varchar(20) not null,
primary key(id)
)engine=innoDB default charset=utf8mb4;
å ·ä½ä»£ç 详è§è¯¾ä¸ç¬è®°
day10/homework
Redis
Redisåºæ¬æ°æ®ç±»ååå½ä»¤ãä¸ç产ç¯å¢çç»å
goæä½Redis
NSQ
å®è£ åé¨ç½²é常ç®å ãåå¸å¼ã æ¶æ¯éå
nsqd
nsqlookupd
nsqadmin
ä»æ¥å 容
go module
å客å°å
ç¥ä¹è¿æ¥
Ginæ¡æ¶
ä¸è½½å¤±è´¥è®¾ç½®ä¸ä¸è¿ä¸ªä»£çï¼
è¦è®¾ç½®
GOPROXY
ï¼å¿ é¡»å å¼å¯
GO111MODULE
SET GO111MODULE=on
设置代çï¼
SET GOPROXY=https://goproxy.cn
ä¸è½½Ginæ¡æ¶
go get -u github.com/gin-gonic/gin
Ginæ¡æ¶åºæ¬ç¤ºä¾
func indexHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "è¿æ¯index页é¢ï¼",
})
}
func main() {
// å¯å¨ä¸ä¸ªé»è®¤çè·¯ç±
router := gin.Default()
// ç»/helloé
ç½®ä¸ä¸ªå¤çå½æ°
router.GET("/hello", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "Hello æ²æ²³ï¼",
})
})
router.GET("/index", indexHandler)
// å¯å¨webserver
router.Run(":9090")
}
RESTful API
MVCæ¶æ
[å¤é¾å¾ç转å失败,æºç«å¯è½æé²çé¾æºå¶,建议å°å¾çä¿åä¸æ¥ç´æ¥ä¸ä¼ (img-gxlFeY1z-1585128858223)(D:\Go4æ\day10\assets\1561263459176.png)]
åå端å离çæ¶æ
MVVM
[å¤é¾å¾ç转å失败,æºç«å¯è½æé²çé¾æºå¶,建议å°å¾çä¿åä¸æ¥ç´æ¥ä¸ä¼ (img-y3QcBOhn-1585128858226)(D:\Go4æ\day10\assets\1561264028435.png)]
postmanè°è¯æ¥å£çå·¥å ·
Ginæ¡æ¶ç渲æ
JSON
c.JSON(ç¶æç ï¼è½å¤è¢«JSONåºååçæ°æ®gin.H{})
HTML
c.HTML(ç¶æç , 模æ¿æ件,æ°æ®)
å 载模æ¿æ件ç两个æ¹æ³
r.LoadHTMLGlob("/模æ¿æ件åæ¾çè·¯å¾/*")
r.LoadHTMLGlob("/模æ¿æ件åæ¾çè·¯å¾/**/*")
r.LoadHTMLFiles("1.html", "2.html", ...)
å è½½éææ件
HTMLéç¨å°çCSSãJSãimageç
XML
c.XML(ç¶æç , æ°æ®)
YAML
c.YAML(ç¶æç ï¼æ°æ®)
Protobuf
åæ°è§£æ
query string
c.Query(âkeyâ)
c.DefaultQuery(âkeyâï¼ âé»è®¤å¼â)
form param
c.PostForm("key")
c.DefaultPostForm("key"ï¼ âé»è®¤å¼â)
path param
url/:key1/:key2
c.Param("key")
书ç±ç®¡ççç»ä¹
书ç±çä¿¡æ¯
â id
â 书å
â ä»·æ ¼
Web页é¢çå¢å æ¹æ¥
å¢å æ¹æ¥
-
项ç®ä»£ç è¦åå±
[å¤é¾å¾ç转å失败,æºç«å¯è½æé²çé¾æºå¶,建议å°å¾çä¿åä¸æ¥ç´æ¥ä¸ä¼ (img-Wdw52j5U-1585128858228)(D:\Go4æ\day10\assets\1561283524663.png)]
- è·¯ç±è·³è½¬
- HTTP跳转
-
c.Redirect(ç¶æç ,"å°å")
-
- è·¯ç±è·³è½¬
- å¨å
·ä½çHandlerä¹é´è·³è½¬
c.Request.URL.Path = "/book/list" r.HandleContext(c)
- å¨å
·ä½çHandlerä¹é´è·³è½¬
- GinåqueryStringãform表åãpath paramçæ¹å¼
- templateè¯æ³
- HTTP跳转
è·¯ç±è·³è½¬
- è·¯ç±è·³è½¬
- HTTP跳转
-
c.Redirect(ç¶æç ,"å°å")
-
- è·¯ç±è·³è½¬
- å¨å
·ä½çHandlerä¹é´è·³è½¬
c.Request.URL.Path = "/book/list" r.HandleContext(c)
- å¨å
·ä½çHandlerä¹é´è·³è½¬
- HTTP跳转
Ginè·¯ç±
è·¯ç±çæ¹æ³
è·¯ç±ç»
liveGroup := r.Group("/live")
{
liveGroup.GET("/index", Handler)
...
}
è·¯ç±çåç
[å¤é¾å¾ç转å失败,æºç«å¯è½æé²çé¾æºå¶,建议å°å¾çä¿åä¸æ¥ç´æ¥ä¸ä¼ (img-ZkXXdW80-1585128858230)(D:\Go4æ\day10\assets\1561285044515.png)]
Ginä¸ä¼ æ件
ä¸ä¼ å个æ件
func uploadHandler(c *gin.Context){
// æåç¨æ·ä¸ä¼ çæ件
fileObj,err := c.FormFile("filename")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"err": err,
})
return
}
// fileobjï¼ä¸ä¼ çæ件对象
// fileobj.filename // æ¿å°ä¸ä¼ æ件çæ件å
filePath := fmt.Sprintf("./%s", fileObj.Filename)
// ä¿åæ件å°æ¬å°çè·¯å¾
c.SaveUploadedFile(fileObj, filePath)
c.JSON(http.StatusOK, gin.H{
"msg": "OK",
})
}
ä¸ä¼ å¤ä¸ªæ件
func main() {
router := gin.Default()
// å¤çmultipart formsæ交æ件æ¶é»è®¤çå
åéå¶æ¯32 MiB
// å¯ä»¥éè¿ä¸é¢çæ¹å¼ä¿®æ¹
// router.MaxMultipartMemory = 8 << 20 // 8 MiB
router.POST("/upload", func(c *gin.Context) {
// Multipart form
form, _ := c.MultipartForm()
files := form.File["file"]
for index, file := range files {
log.Println(file.Filename)
dst := fmt.Sprintf("C:/tmp/%s_%d", file.Filename, index)
// ä¸ä¼ æ件å°æå®çç®å½
c.SaveUploadedFile(file, dst)
}
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("%d files uploaded!", len(files)),
})
})
router.Run()
}
ä½ä¸
- æBMSçå¢å æ¥ èªå·±åä¸é
- æç¼è¾ä¹¦ç±çåè½èªå·±å®ç°
- é¾ç¹ï¼
- 第ä¸æ¬¡æ¯GET请æ±ï¼æ¿å°ä¸ä¸ªé¡µé¢ï¼é¡µé¢ä¸æé»è®¤å¼
- 第äºæ¬¡ç¹æ交æ¯åPOST请æ±ï¼å¨æ°æ®åºæ´æ°æ°æ®ä¹åè¦è¿å/book/list页é¢
- Blog项ç®
- æ³ä¸ä¸è¡¨ç»æ
- ç¨æ·
- æç«
- è¯è®º
- åç±»
- æ³ä¸ä¸è¡¨ç»æ
æªæ¥å 容
context
欢è¿ä½¿ç¨Markdownç¼è¾å¨
ä½ å¥½ï¼ è¿æ¯ä½ 第ä¸æ¬¡ä½¿ç¨ Markdownç¼è¾å¨ æå±ç¤ºç欢è¿é¡µãå¦æä½ æ³å¦ä¹ å¦ä½ä½¿ç¨Markdownç¼è¾å¨, å¯ä»¥ä»ç»é 读è¿ç¯æç« ï¼äºè§£ä¸ä¸Markdownçåºæ¬è¯æ³ç¥è¯ã
æ°çæ¹å
æ们对Markdownç¼è¾å¨è¿è¡äºä¸äºåè½æå±ä¸è¯æ³æ¯æï¼é¤äºæ åçMarkdownç¼è¾å¨åè½ï¼æ们å¢å äºå¦ä¸å ç¹æ°åè½ï¼å¸®å©ä½ ç¨å®åå客ï¼
- å ¨æ°ççé¢è®¾è®¡ ï¼å°ä¼å¸¦æ¥å ¨æ°çåä½ä½éªï¼
- å¨åä½ä¸å¿è®¾ç½®ä½ åç±ç代ç é«äº®æ ·å¼ï¼Markdown å°ä»£ç çæ¾ç¤ºéæ©çé«äº®æ ·å¼ è¿è¡å±ç¤ºï¼
- å¢å äº å¾çææ½ åè½ï¼ä½ å¯ä»¥å°æ¬å°çå¾çç´æ¥ææ½å°ç¼è¾åºåç´æ¥å±ç¤ºï¼
- å ¨æ°ç KaTeXæ°å¦å ¬å¼ è¯æ³ï¼
- å¢å äºæ¯æçç¹å¾çmermaidè¯æ³1 åè½ï¼
- å¢å äº å¤å±å¹ç¼è¾ Markdownæç« åè½ï¼
- å¢å äº ç¦ç¹åä½æ¨¡å¼ãé¢è§æ¨¡å¼ãç®æ´åä½æ¨¡å¼ãå·¦å³åºååæ¥æ»è½®è®¾ç½® çåè½ï¼åè½æé®ä½äºç¼è¾åºåä¸é¢è§åºåä¸é´ï¼
- å¢å äº æ£æ¥å表 åè½ã
åè½å¿«æ·é®
æ¤éï¼Ctrl/Command + Z
éåï¼Ctrl/Command + Y
å ç²ï¼Ctrl/Command + B
æä½ï¼Ctrl/Command + I
æ é¢ï¼Ctrl/Command + Shift + H
æ åºå表ï¼Ctrl/Command + Shift + U
æåºå表ï¼Ctrl/Command + Shift + O
æ£æ¥å表ï¼Ctrl/Command + Shift + C
æå ¥ä»£ç ï¼Ctrl/Command + Shift + K
æå ¥é¾æ¥ï¼Ctrl/Command + Shift + L
æå ¥å¾çï¼Ctrl/Command + Shift + G
æ¥æ¾ï¼Ctrl/Command + F
æ¿æ¢ï¼Ctrl/Command + G
åççå建æ é¢ï¼æå©äºç®å½ççæ
ç´æ¥è¾å ¥1次#ï¼å¹¶æä¸spaceåï¼å°çæ1级æ é¢ã
è¾å ¥2次#ï¼å¹¶æä¸spaceåï¼å°çæ2级æ é¢ã
以æ¤ç±»æ¨ï¼æ们æ¯æ6级æ é¢ãæå©äºä½¿ç¨
TOC
è¯æ³åçæä¸ä¸ªå®ç¾çç®å½ã
å¦ä½æ¹åææ¬çæ ·å¼
强è°ææ¬ å¼ºè°ææ¬
å ç²ææ¬ å ç²ææ¬
æ è®°ææ¬
å é¤ææ¬
å¼ç¨ææ¬
H2O isæ¯æ¶²ä½ã
210 è¿ç®ç»ææ¯ 1024.
æå ¥é¾æ¥ä¸å¾ç
é¾æ¥: link.
å¾ç:
带尺寸çå¾ç:
å± ä¸çå¾ç:
å± ä¸å¹¶ä¸å¸¦å°ºå¯¸çå¾ç:
å½ç¶ï¼æ们为äºè®©ç¨æ·æ´å 便æ·ï¼æ们å¢å äºå¾çææ½åè½ã
å¦ä½æå ¥ä¸æ®µæ¼äº®ç代ç ç
å»å客设置页é¢ï¼éæ©ä¸æ¬¾ä½ å欢ç代ç çé«äº®æ ·å¼ï¼ä¸é¢å±ç¤ºåæ ·é«äº®ç
代ç ç
.
// An highlighted block
var foo = 'bar';
çæä¸ä¸ªéåä½ çå表
- 项ç®
- 项ç®
- 项ç®
- 项ç®
- 项ç®1
- 项ç®2
- 项ç®3
- 计åä»»å¡
- å®æä»»å¡
å建ä¸ä¸ªè¡¨æ ¼
ä¸ä¸ªç®åçè¡¨æ ¼æ¯è¿ä¹å建çï¼
é¡¹ç® | Value |
---|---|
çµè | $1600 |
ææº | $12 |
导管 | $1 |
设å®å å®¹å± ä¸ãå± å·¦ãå± å³
使ç¨
:---------:
å± ä¸
使ç¨
:----------
å± å·¦
使ç¨
----------:
å± å³
第ä¸å | 第äºå | 第ä¸å |
---|---|---|
第ä¸åææ¬å± ä¸ | 第äºåææ¬å± å³ | 第ä¸åææ¬å± å·¦ |
SmartyPants
SmartyPantså°ASCIIæ ç¹å符转æ¢ä¸ºâæºè½âå°å·æ ç¹HTMLå®ä½ãä¾å¦ï¼
TYPE | ASCII | HTML |
---|---|---|
Single backticks | | âIsnât this fun?â |
Quotes | | âIsnât this fun?â |
Dashes | | â is en-dash, â is em-dash |
å建ä¸ä¸ªèªå®ä¹å表
- Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
å¦ä½å建ä¸ä¸ªæ³¨è
ä¸ä¸ªå ·æ注èçææ¬ã2
注éä¹æ¯å¿ ä¸å¯å°ç
Markdownå°ææ¬è½¬æ¢ä¸º HTMLã
KaTeXæ°å¦å ¬å¼
æ¨å¯ä»¥ä½¿ç¨æ¸²æLaTeXæ°å¦è¡¨è¾¾å¼ KaTeX:
Gammaå ¬å¼å±ç¤º Î ( n ) = ( n â 1 ) ! â n â N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Î(n)=(nâ1)!ânâN æ¯éè¿æ¬§æ积å
Î ( z ) = â« 0 â t z â 1 e â t d t â . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Î(z)=â«0ââtzâ1eâtdt.
ä½ å¯ä»¥æ¾å°æ´å¤å ³äºçä¿¡æ¯ LaTeX æ°å¦è¡¨è¾¾å¼here.
æ°ççç¹å¾åè½ï¼ä¸°å¯ä½ çæç«
- å ³äº çç¹å¾ è¯æ³ï¼åè è¿å¿,
UML å¾è¡¨
å¯ä»¥ä½¿ç¨UMLå¾è¡¨è¿è¡æ¸²æã Mermaid. ä¾å¦ä¸é¢äº§ççä¸ä¸ªåºåå¾ï¼
è¿å°äº§çä¸ä¸ªæµç¨å¾ã:
- å ³äº Mermaid è¯æ³ï¼åè è¿å¿,
FLowchartæµç¨å¾
æ们ä¾æ§ä¼æ¯æflowchartçæµç¨å¾ï¼
- å ³äº Flowchartæµç¨å¾ è¯æ³ï¼åè è¿å¿.
导åºä¸å¯¼å ¥
导åº
å¦æä½ æ³å°è¯ä½¿ç¨æ¤ç¼è¾å¨, ä½ å¯ä»¥å¨æ¤ç¯æç« ä»»æç¼è¾ãå½ä½ å®æäºä¸ç¯æç« çåä½, å¨ä¸æ¹å·¥å ·æ æ¾å° æç« å¯¼åº ï¼çæä¸ä¸ª.mdæ件æè .htmlæ件è¿è¡æ¬å°ä¿åã
å¯¼å ¥
å¦æä½ æ³å è½½ä¸ç¯ä½ åè¿ç.mdæ件ï¼å¨ä¸æ¹å·¥å ·æ å¯ä»¥éæ©å¯¼å ¥åè½è¿è¡å¯¹åºæ©å±åçæä»¶å¯¼å ¥ï¼
继ç»ä½ çåä½ã
- mermaidè¯æ³è¯´æ â©ï¸
- 注èç解é â©ï¸