十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
Golang 的創(chuàng)建是為了實現(xiàn)最大的用戶效率和編碼效率。已經(jīng)熟悉 Java 或 PHP 的程序員可以在幾周內(nèi)接受 Go 的培訓(xùn)(許多人最終會更喜歡它)。在本文中,Dewet Diener 探討了 Golang 的優(yōu)缺點,以及它的測試驅(qū)動開發(fā) (TDD) 如何完美契合。
創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為獨山子等服務(wù)建站,獨山子等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為獨山子企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
Golang 由 Google 開發(fā)和設(shè)計,于 2009 年作為一種綜合性編程語言首次出現(xiàn),旨在最大限度地提高編碼效率。創(chuàng)建該語言的目的是修正其他已建立語言的缺陷。盡管 Golang(或簡稱為“Go”)是一門年輕的語言,但已經(jīng)積累了大量的開發(fā)人員,因此我們想分享為什么在 Curve 我們喜歡 Golang,以及我們?nèi)绾尾捎盟鼇韺崿F(xiàn)我們移動銀行業(yè)務(wù)的目標(biāo)到云端。
Go 是一種精致的編程語言:它支持“所見即所得”的原則,這意味著清晰易讀的代碼和更少的復(fù)雜抽象。該語言本身易于使用且易于訓(xùn)練。盡管如此,作為一個相對較新的生態(tài)系統(tǒng),要找到對 Go 具有廣泛預(yù)先知識的工程師可能會很棘手。
然而,與其他編程語言不同,Go 的創(chuàng)建是為了最大限度地提高用戶效率。因此,具有 Java 或 PHP 背景的開發(fā)人員和工程師可以在幾周內(nèi)獲得使用 Go 的技能和培訓(xùn)——根據(jù)我們的經(jīng)驗,他們中的許多人最終更喜歡它。
在 Curve,我們大力提倡測試驅(qū)動開發(fā) (TDD),Go 的框架與這種方法保持一致。通過簡單地命名一個文件 foo_test.go 并在該文件中添加結(jié)構(gòu)化測試函數(shù),Go 將快速有效地運行您的單元測試。這一創(chuàng)新功能提高了生產(chǎn)力,因為它可以更加專注于測試驅(qū)動的開發(fā)和改進的同行評審機會。
Golang 具有出色的生產(chǎn)優(yōu)化品質(zhì),例如內(nèi)存占用小,這支持其在大型項目中作為構(gòu)建塊的能力,以及開箱即用的與其他架構(gòu)的輕松交叉編譯。由于 Go 代碼被編譯為單個靜態(tài)二進制文件,因此它可以輕松進行容器化,并且通過擴展,將 Go 部署到任何高可用性環(huán)境(例如 Kubernetes)中幾乎是微不足道的。
它提供了一種機制來保護工作負載,通過擁有非常纖薄的生產(chǎn)容器而沒有任何無關(guān)的依賴項。這使得構(gòu)建、部署和維護基于 Go 的資產(chǎn)更加直接和安全,并為希望建立或發(fā)展其微服務(wù)戰(zhàn)略的公司提供了可靠的選擇。
Go 是專門為滿足我們快速發(fā)展的技術(shù)生態(tài)系統(tǒng)的需求而創(chuàng)建的。例如,Go 可以滿足您構(gòu)建 API 所需的一切,并將其作為其標(biāo)準(zhǔn)庫的一部分。它使用簡單,高性能的 http 服務(wù)器消除了團隊設(shè)計新項目時經(jīng)常發(fā)生的一些常見的 探索 和設(shè)計癱瘓問題——這對于一些其他流行語言(如 Java 和 Node.js)來說太常見了。
Golang 還通過其內(nèi)置于語言本身的自動格式化程序巧妙地解決了代碼格式化分歧。這完全消除了格式爭議,進而提高了團隊的生產(chǎn)力和注意力。
盡管我是 Go 的擁護者,但它顯然也不是沒有缺陷。一個爭論不休的特性是 Go 沒有顯式接口,這是許多開發(fā)人員習(xí)慣的概念。雖然不是有害的,但它可以使選擇最適合您的結(jié)構(gòu)的接口成為一項任務(wù)。這是因為您不會像在其他流行的編程語言中那樣編寫 X 實現(xiàn) Y,但您很快就會接受。
依賴管理也是另一個不屬于 Google Golang 開發(fā)團隊原始設(shè)計的功能。開源社區(qū)介入并創(chuàng)建了 Glide 和 Dep,最初的努力并沒有完全解決問題。從 Go 1.11 開始,添加了對模塊的支持,這似乎已成為官方的依賴管理工具。這些挑戰(zhàn)并沒有削弱 Go 作為一種高效編程語言的獨創(chuàng)性,并且它繼續(xù)為我們提供優(yōu)于其他編程語言的顯著優(yōu)勢。
Golang 吸引了全球敏銳的開發(fā)人員的注意,并且圍繞它的興奮繼續(xù)增長。開源社區(qū)因有趣的項目而蓬勃發(fā)展;最著名的是 Docker 和 Kubernetes。
正是這種新鮮、有創(chuàng)意但又簡單的包裝吸引了我們?nèi)o:它是一種令人興奮的編碼語言,可以幫助我們在 Curve 中快速開發(fā)以構(gòu)建更好的產(chǎn)品。
PostgreSQL和MySQL比較,它更加龐大一點,因為它是用來替代Oracle而設(shè)計的。所以在企業(yè)應(yīng)用中采用PostgreSQL是一個明智的選擇。
現(xiàn)在MySQL被Oracle收購之后,有傳聞Oracle正在逐步的封閉MySQL,,鑒于此,將來我們也許會選擇PostgreSQL而不是MySQL作為項目的后端數(shù)據(jù)庫。
1、驅(qū)動
Go實現(xiàn)的支持PostgreSQL的驅(qū)動也很多,因為國外很多人在開發(fā)中使用了這個數(shù)據(jù)庫。
支持database/sql驅(qū)動,純Go寫的
支持database/sql驅(qū)動,純Go寫的
支持database/sql驅(qū)動,純Go寫的
在下面的示例中我采用了第一個驅(qū)動,因為它目前使用的人最多,在github上也比較活躍。
2、實例代碼
數(shù)據(jù)庫建表語句:
復(fù)制代碼
CREATE TABLE userinfo
(
uid serial NOT NULL,
username character varying(100) NOT NULL,
departname character varying(500) NOT NULL,
Created date,
CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
)
WITH (OIDS=FALSE);
CREATE TABLE userdeatail
(
uid integer,
intro character varying(100),
profile character varying(100)
)
WITH(OIDS=FALSE);
復(fù)制代碼
看下面這個Go如何操作數(shù)據(jù)庫表數(shù)據(jù):增刪改查
復(fù)制代碼
package main
import (
"database/sql"
"fmt"
_ "github.com/bmizerany/pq"
)
func main() {
db, err := sql.Open("postgres", "user=astaxie password=astaxie dbname=test sslmode=disable")
checkErr(err)
//插入數(shù)據(jù)
stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")
checkErr(err)
res, err := stmt.Exec("astaxie", "研發(fā)部門", "2012-12-09")
checkErr(err)
//pg不支持這個函數(shù),因為他沒有類似MySQL的自增ID
id, err := res.LastInsertId()
checkErr(err)
fmt.Println(id)
//更新數(shù)據(jù)
stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2")
checkErr(err)
res, err = stmt.Exec("astaxieupdate", 1)
checkErr(err)
affect, err := res.RowsAffected()
checkErr(err)
fmt.Println(affect)
//查詢數(shù)據(jù)
rows, err := db.Query("SELECT * FROM userinfo")
checkErr(err)
for rows.Next() {
var uid int
var username string
var department string
var created string
err = rows.Scan(uid, username, department, created)
checkErr(err)
fmt.Println(uid)
fmt.Println(username)
fmt.Println(department)
fmt.Println(created)
}
//刪除數(shù)據(jù)
stmt, err = db.Prepare("delete from userinfo where uid=$1")
checkErr(err)
res, err = stmt.Exec(1)
checkErr(err)
affect, err = res.RowsAffected()
checkErr(err)
fmt.Println(affect)
db.Close()
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
復(fù)制代碼
從上面的代碼我們可以看到,PostgreSQL是通過$1,$2這種方式來指定要傳遞的參數(shù),而不是MySQL中的?,另外在sql.Open中的dsn信息的格式也與MySQL的驅(qū)動中的dsn格式不一樣,所以在使用時請注意它們的差異。
還有pg不支持LastInsertId函數(shù),因為PostgreSQL內(nèi)部沒有實現(xiàn)類似MySQL的自增ID返回,其他的代碼幾乎是一模一樣
個人認(rèn)為:
1、上手快
只要你有其會其他語言,學(xué)習(xí)go很快。
2、go語言非常適合寫服務(wù)端
因為它開源,所以很容易找到你想要的框架,開發(fā)效率非常高。
3、跨平臺
你的一個程序可以隨意部署。
不受操作系統(tǒng)限制,windwos、linux、macos都能支持。
不受處理器限制,x86、arm也都可以,你要知道國產(chǎn)可替代的U就是arm。
4、部署簡單
編譯成一個文件就可以發(fā)布了,不需要環(huán)境支撐。
以上是最基本的理由,當(dāng)然這些對于.net core來說也一樣,但是對比一下發(fā)布的文件大小你就知道該選擇誰了。