中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

使用Golang快速構建WEB應用
來源:易賢網 閱讀:1894 次 日期:2015-04-02 13:57:45
溫馨提示:易賢網小編為您整理了“使用Golang快速構建WEB應用”,方便廣大網友查閱!

1.Abstract

在學習web開發的過程中會遇到很多困難,因此寫洗一篇類似綜述類的文章。作為路線圖從web開發要素的index出發來介紹golang開發的學習流程以及Example代碼。

在描述中多是使用代碼來描述使用方法不會做過多的說明。最后可以方便的copy代碼來實現自己的需求。

本文適應對象:

對web開發有一定經驗的人

能夠靈活使用ajax的人(至少懂得前后分離)

golang web 開發有一定了解,至少略讀過一些golang web開發的書籍

看完本文之后您會收獲:

golang web開發的一些技巧

golang web開發的一些實用API

本文在描述的時候為了解釋盡量詳細,已經把解釋寫到代碼注釋中。

2.golang web 開發check list

略過的部分:基本流程控制,OOP等基礎語法知識。

2.1本章節提供golang web開發的知識面參考。

1.Abstract

2.golang web 開發check list

2.1 本章節提供golang_web開發的知識面參考。

3.路由器

3.1 手動路由

3.2 手動路由的綁定

3.2.1 靜態文件

3.2.2 固定函數與資源獲取

4.頁面加載

4.1 純靜態頁(HTML)

4.2 模板頁面的加載

5.表示層腳本

5.1 require.js

5.1.1 加載

5.1.2 頁面Business

5.2 JQuery

6.業務層

7.持久層

7.1 Mysql

7.2 Mongodb

8.單元測試注意事項

9.LOG

總結

3.路由器

路由器是整個網站對外的靈魂,如果路由做的不好URL會非常惡心。

所以這部分設計成第一個要說的內容。

路由分兩種一種是手動路由為了通過tul調度固定的功能,另外一點就是資源

的獲取,通過url的分析來模仿靜態頁的方式來獲取資源(類似get)

自動路由,主要使用OOP的COMMAND模式來實現。所有功能使用post,

統一入口,方便權限管理,安全管理,跨域管理。但是如此強大的功能還是

交給框架來做吧。這里就不給新手做參考了。

3.1手動路由

package main

import (

"log"

"net/http"

)

func main() {

RouterBinding() // 路由綁定函數

err := http.ListenAndServe(":9090", nil) //設置監聽的端口

if err != nil {

log.Fatal("ListenAndServe: ", err)

}

}

在httpserver運行之前先綁定路由

3.2 手動路由的綁定

3.2.1 靜態文件

http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("./pages"))))

3.2.2 固定函數與資源獲取

他們都是一樣的

http.HandleFunc("/images/", fileUpload.DownloadPictureAction)

4.頁面加載

4.1 純靜態頁(HTML)

直接交給路由就行了。自動就訪問那個文件夾了。不過生產環境果然還得是cdn,如果自己服務器比較多。可以nginx反向代理。

主要好處前后分離,能上CDN就是通訊次數多了。不過通過優化改善之類的都還ok啦。

4.2 模板頁面的加載僅提供關鍵代碼。

commonPage, err := template.ParseFiles("pages/common/head.gtpl", //加載模板

"pages/common/navbar.gtpl", "pages/common/tail.gtpl")

if err != nil {

panic(err.Error())

}

navArgs := map[string]string{"Home": "home", "User": "yupengfei"}//復雜的參數開始往里塞

knowledgePage, err := template.ParseFiles("pages/knowledge/knowledge.gtpl")

knowledgeArgs := map[string]interface{}{"Head": "This is a test title",

"Author": "kun.wang", "PublishDatetime": "2014-09-14",

"Content": template.HTML("<p style="text-indent: 2em">為什么要用語義呢?</p>")}//不是不好,只是做字符串分析會影響工程效率

commonPage.ExecuteTemplate(w, "header", nil)// render 開始

commonPage.ExecuteTemplate(w, "navbar", navArgs)

knowledgePage.ExecuteTemplate(w, "knowledge", knowledgeArgs)

commonPage.ExecuteTemplate(w, "tail", nil)

僅提供關鍵代碼。

字符串數組作為輸入參數差錯比較困難

總結:雖然減少的通訊次數,但是沒辦法上CDN蛋疼,另外,模板的mapping蛋疼。

5.表示層腳本

表示層腳本做的比較困難也不是很好學。

但是一旦搞定了,代碼的復用性會有非常可觀的提升。

就普通情況而言JS開發效率是非常高的靈活度高,并且使用的是客戶端的cpu

性能好,免費資源多,學習的人也多,好招聘。

5.1 require.js

5.1.1 加載

<script data-main="/reqmod/login_main" language="JavaScript" defer async="true" src="js/r.js"></script>

整個網頁之留這么一個加載腳本的入口(每個頁面最好只有一個js文件)

好處

js是延遲加載。不會出現網頁卡死的情況

最大化使用緩存。(HTTP 304)

一個網頁只用一個js

dom事件綁定,不用在html控件上寫js綁定了

壞處

學習比較難

網站更新始終有緩存沒更新的瀏覽器。造成錯誤(所以有些情況客戶自己就知道多刷新幾次了,已經成用戶習慣了)

參數解釋

`data-main` 業務邏輯入口,載入當前字符串.js這個文件

`language` 不解釋

`defer async` 字面意思

`src` r.js就是require.js的意思。代碼到處都能搞到。

5.1.2 頁面Business

加載依賴文件

require.baseUrl = "/"

require.config({

baseUrl: require.baseUrl,

paths: {

"jquery": "js/jquery-1.10.2.min",

"domready" : "reqmod/domReady",

"pm" : "reqmod/pmodal",

"cookie":"reqmod/cookie",

"user":"reqmod/user",

"bootstrap": "reqmod/bootstrap.min",

"nav":"reqmod/nav"

},

shim: {

'bootstrap': {

deps: ['jquery']

}

}

});

//直接copy全搞定。

執行頁面business

執行里面做的最多的就是dom跟事件綁定而已。加載各種js庫直接引用。

代碼美觀,開發效率,執行效率都是非常棒的。

require(['nav','domready', 'jquery', 'user','pm'], function (nav,doc, $, user,pm){

//這個函數的第一個`數組`參數是選擇的依賴的模塊。1. 網站絕對路徑。 2. 使用加載依賴模塊的時候選擇export的內容

//數組的順序要跟function順序一致,如果有兩個模塊依賴比如說jquery插件,就寫道最后不用變量,直接使用`$`

doc(function () { // domReady

pm.load();//加載各種插件HTML模板之類的都ok

$('#btn_login')[0].onclick = function(){user.login();}//button 事件綁定

});

});

頁面MODEL

define(['jquery','reqmod/cookie','user','bootstrap'],function ($,cookie,user){

//define 函數的參數內容require是一樣的。

// 這里依賴的模塊要在調用此模塊中的模塊中有path配置。不然會死的很慘,報錯的時候不會說缺少什么什么地方錯了。

var nav_load = function () { // 注意函數定義的方式copy就行

$.get('/nav.html', function(result){

var newNode = document.createElement("div");

newNode.innerHTML = result;

$('body')[0].insertBefore(newNode,$('body')[0].firstChild);

//document.body.innerHTML = result + document.body.innerHTML;

$('#btn_login')[0].onclick = function(){user.login();}

$('#btn_reg')[0].onclick = function(){window.location='/register.html'}

$.post('/login_check',{},function(data){

if(data==0){

Form_login.style.display=""

}

else{

form_userInfo.style.display=""

}

})

});

}

return {//這里類似微型路由。非常靈活,非常方便

load :nav_load

};

});

5.2 JQuery

JQ的功能只要require.js引用了之后基本上都是一樣的。

如果有需要可以到w3school上學習一下。

6.業務層

Post分析

func XXXAction(w http.ResponseWriter, r *http.Request) {

r.parseForm() //有這個才能獲取參數

r.Form["Email"] // 獲取Email 參數(String)

// 寫接下來的業務。

}

資源入口函數資源require分析(url分析固定寫法)

func Foo(w http.ResponseWriter, r *http.Request) {

queryFile := strings.Split(r.URL.Path, "/")

queryResource := queryFile[len(queryFile)-1] // 解析文件

}

//完成字符串分割之后,按照需求來獲取資源就可以了。

直接輸入object

data, err := ioutil.ReadAll(r.Body) //直接讀取form為 json 字符串

if err != nil {

utility.SimpleFeedBack(w, 10, "failed to read body")

pillarsLog.PillarsLogger.Print("failed to read body")

return

}

k := 【BUSINESS OBJECT】

err = json.Unmarshal(data, &k)

if err != nil {

utility.SimpleFeedBack(w, 13, "Pramaters failed!")

pillarsLog.PillarsLogger.Print("Pramaters failed!")

return

}

//方便快捷。再訪問參數的時候,直接調用結構體參數就可以了。

//注意ajax調用函數的時候需要做出一些調整代碼如下:

$.ajax([dist],JSON.stringify([data]),function(){},'json');//注意JSON

7.持久層

7.1 Mysql

其實不管什么語言的Mysql驅動都是從PRO*C來的,所以會PRO*C之后,啥都好說

Insert Delete Update

stmt, err := mysqlUtility.DBConn.Prepare("INSERT INTO credit (credit_code, user_code, credit_rank) VALUES (?, ?, ?)")

if err != nil {

pillarsLog.PillarsLogger.Print(err.Error())

return false, err

}

defer stmt.Close()

_, err = stmt.Exec(credit.CreditCode, credit.UserCode, credit.CreditRank)

if err != nil {

return false, err

} else {

return true, err

}

//還是比較方便的

Query

stmt, err := mysqlUtility.DBConn.Prepare(`SELECT commodity_code, commodity_name, description, picture,

price, storage, count, status,

insert_datetime, update_datetime FROM commodity WHERE commodity_code = ?`)

if err != nil {

return nil, err

}

defer stmt.Close()

result, err := stmt.Query(commodityCode)

if err != nil {

return nil, err

}

defer result.Close()

var commodity utility.Commodity

if result.Next() {

err = result.Scan(&(commodity.CommodityCode), &(commodity.CommodityName), &(commodity.Description),

&(commodity.Picture), &(commodity.Price), &(commodity.Storage), &(commodity.Count), &(commodity.Status),

&(commodity.InsertDatetime), &(commodity.UpdateDatetime))

if err != nil {

pillarsLog.PillarsLogger.Print(err.Error())

return nil, err

}

}

return &commodity, err

7.2 Mongodb

err := mongoUtility.PictureCollection.Find(bson.M{"picturecode":*pictureCode}).One(&picture)

這里只給出最簡單的例子。具體的看mgo的開發文檔就ok。還是比較簡單的。

8.單元測試注意事項

測試命令 go test -v (沒有其他參數了!!!) 如果不帶-v只顯示結果,不顯示調試過程,主要是調試開發的時候用

文件格式 xxx_test.go 但是建議改成 xxx_test0.go 或者喜歡改成別的也可以。

由于測試先行的原則,在開發的時候一次測試也就一兩個函數。

這樣相當于把其他測試注釋掉

測試的時候的配置文件要放到測試目錄下面。別忘了。

心態,錯誤太多一個一個來,要有個好心態。

9.LOG

注意在調試中Log的不可缺失性。

下面api如果不知道從何而來直接doc搜索就可以了。

package utility

import "log"

import "os"

import "fmt"

// Logger Model min variable.

var Logger *log.Logger

var outFile *os.File

// init function if Logger if not inited will invoke this function

func init() {

if Logger == nil {

propertyMap := ReadProperty("pic.properties")

logFileName := propertyMap["LogFile"]

fmt.Println("Initial and Open log file ", logFileName)

var err error

outFile, err = os.OpenFile(logFileName, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)

if err != nil {

panic(err.Error())

}

Logger = log.New(outFile, "", log.Ldate|log.Ltime|log.Llongfile)

}

}

// CloseLogFile function : close Logger invoke file.

func CloseLogFile() {

outFile.Close()

}

使用方法:

utility.Logger.Println("Log test")

總結

看完這里copy代碼日常工作還是能好應付一點。

如果是新手看完這個之后,看那么厚的書就有一定的目標性了。能方便一點在學習web開發的過程中會遇到很多困難,因此寫洗一篇類似綜述類的文章。作為路線圖從web開發要素的index出發來介紹golang開發的學習流程以及Example代碼。

更多信息請查看IT技術專欄

更多信息請查看技術文章
易賢網手機網站地址:使用Golang快速構建WEB應用
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产在线不卡| 国产精品一区二区黑丝| 欧美经典一区二区三区| 亚洲国产精品高清久久久| 久久婷婷一区| 亚洲激情校园春色| 欧美激情视频免费观看| 夜夜嗨av一区二区三区| 国产精品制服诱惑| 麻豆精品网站| 亚洲午夜视频在线观看| 国产日韩精品一区| 免费在线观看精品| 亚洲一区二区在线免费观看视频 | 久久久噜噜噜久久中文字免| 狠狠色伊人亚洲综合网站色| 免费亚洲婷婷| 亚洲在线观看视频| 狠狠操狠狠色综合网| 欧美激情久久久久| 亚洲欧美三级在线| 亚洲福利视频三区| 国产精品v亚洲精品v日韩精品| 久久国产精品一区二区三区| 亚洲精品女av网站| 国产女优一区| 欧美精品色综合| 久久精品主播| 亚洲免费伊人电影在线观看av| 精品88久久久久88久久久| 欧美日韩一区三区| 免费日韩成人| 久久精品日产第一区二区| 99亚洲视频| 亚洲高清123| 国产一区二区三区高清| 欧美婷婷在线| 欧美日韩免费一区二区三区视频| 久久这里有精品15一区二区三区| 亚洲欧美精品中文字幕在线| 亚洲人成人99网站| 狠狠综合久久av一区二区小说| 国产精品劲爆视频| 欧美日韩一区三区四区| 欧美成人视屏| 麻豆精品视频在线| 久久久噜噜噜久久狠狠50岁| 久久9热精品视频| 午夜精品婷婷| 亚洲欧美一区二区三区久久| 亚洲视频第一页| 一区二区三区欧美视频| 亚洲精品一区二区三区樱花| 亚洲高清色综合| 亚洲国产成人av在线 | 欧美日韩亚洲一区二区三区四区| 久久久综合激的五月天| 久久精品国产亚洲一区二区| 午夜国产精品影院在线观看 | 久久久久一区| 久久久999| 久久久av毛片精品| 久久久在线视频| 久久资源在线| 麻豆精品精华液| 女女同性女同一区二区三区91| 欧美高清在线播放| 欧美日韩成人激情| 欧美人在线视频| 国产精品国产三级国产普通话三级 | 亚洲无毛电影| 亚洲欧美成人综合| 久久精品视频在线看| 久久久精品日韩欧美| 久久一区激情| 欧美精品一区二区视频| 国产精品欧美日韩| 欧美午夜视频| 国产午夜精品理论片a级大结局| 韩国视频理论视频久久| 在线观看视频免费一区二区三区 | 亚洲国产婷婷香蕉久久久久久| 亚洲国产欧美日韩| 夜夜爽av福利精品导航 | 亚洲乱码国产乱码精品精98午夜 | 香蕉av福利精品导航| 久久久久久97三级| 久久成人人人人精品欧| 久久超碰97人人做人人爱| 午夜欧美精品久久久久久久| 亚洲欧美精品中文字幕在线| 国产精品狠色婷| 极品尤物av久久免费看| 在线播放日韩专区| 一本色道久久综合狠狠躁篇怎么玩| 99国产精品国产精品久久 | 欧美一级视频精品观看| 亚洲国产精品一区二区久| 校园春色综合网| 国产精品一区二区久久久久| 欧美精品一区二区蜜臀亚洲| 亚洲色图制服丝袜| 国产亚洲欧美一区二区三区| 欧美亚洲一级| 亚洲免费不卡| 欧美精品自拍偷拍动漫精品| 亚洲欧洲一级| 国产精品视频精品| 开元免费观看欧美电视剧网站| 伊伊综合在线| 欧美日韩免费一区| 久久国产色av| 一本色道久久99精品综合| 欧美午夜精品久久久久久超碰| 久久噜噜噜精品国产亚洲综合 | 狠狠色综合色区| 久久美女性网| 亚洲一区观看| 99视频精品全国免费| 国产欧美日韩一区二区三区在线观看 | 国产日韩av高清| 久久精品99国产精品酒店日本| 亚洲国产欧美在线人成| 国产一区二区黄| 国产精品视频一二三| 欧美日韩福利| 欧美精品亚洲| 欧美大片91| 欧美韩日一区二区三区| 久久综合久久久| 嫩草成人www欧美| 免费成人av在线看| 欧美一级久久久久久久大片| 亚洲第一福利社区| 国产曰批免费观看久久久| 欧美日韩一区成人| 欧美日韩综合不卡| 国产精品h在线观看| 国产日韩欧美精品一区| 国产精品色网| 狠狠色2019综合网| 欧美在线播放一区二区| 久久精品一本| 欧美日韩一区免费| 国产精品午夜国产小视频| 国产精品―色哟哟| 欧美韩日视频| 欧美黄色免费网站| 麻豆九一精品爱看视频在线观看免费| 久久精品国产在热久久 | 亚洲精品乱码久久久久久按摩观| 国产情人综合久久777777| 影音先锋国产精品| 亚洲一区免费视频| 蘑菇福利视频一区播放| 欧美电影在线观看| 国产专区欧美专区| 夜夜嗨av一区二区三区四区| 国产精品日韩欧美一区二区三区| 国产精品青草久久| 国产欧美日韩综合一区在线观看| 亚洲欧洲视频| 午夜精品理论片| 欧美日韩爆操| 亚洲三级电影在线观看 | 欧美在线日韩精品| 国产精品mm| 午夜免费日韩视频| 国产精品视频1区| 一区二区三区.www| 欧美日韩免费高清| 日韩视频一区二区三区在线播放| 久久久精品动漫| 亚洲国产成人在线视频| 久久男女视频| 亚洲电影第1页| 美女视频黄 久久| 亚洲免费成人av电影| 欧美视频不卡| 好吊色欧美一区二区三区视频| 欧美亚洲一区二区在线观看| 欧美高清在线一区| 亚洲欧美视频| 在线观看亚洲| 欧美日韩一区在线| 久久福利毛片| 中日韩男男gay无套| 国产欧美三级| 欧美视频中文字幕在线| 久久久久久亚洲综合影院红桃 | 国产一区二区三区久久悠悠色av| 亚洲综合清纯丝袜自拍| 在线播放亚洲一区| 国产日韩欧美精品一区| 欧美成在线视频| 久久国产精品毛片| 亚洲精品韩国| 欧美成人午夜77777| 亚洲欧美国产精品桃花| 欧美日本在线播放|