C++適合本地程序的開發(fā)。Go語言適合網(wǎng)絡(luò)程序和本地程序的開發(fā)。Go的優(yōu)點:垃圾回收,語意明確,格式統(tǒng)一。?Go的缺點:效率目前沒有C++高,但對于桌面程序而言,效率問題不大,因為硬件已經(jīng)很快了。c++過于復(fù)雜了,加入很多炫技的內(nèi)容。這些內(nèi)容脫離了事情的本質(zhì)。
汝陽網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。成都創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
最明顯的就是所謂的面向?qū)ο蟆;诿嫦驅(qū)ο蟮墓こ倘绻銐虼蟮那闆r下,會帶來很大的耦合度,如果再加上內(nèi)存管理,多線程等等。項目后期基本上沒辦法維護(hù)和增加功能。
關(guān)于c++的語言復(fù)雜性,你可以問知乎上的任何一位高手。沒一個敢說自己精通c++。你也可以去看一下所有的c++編繹器,沒有任何一個敢說自己完全實現(xiàn)了c++的標(biāo)準(zhǔn)。不同的編繹器之間實現(xiàn)細(xì)節(jié)又不同。所以功能再強(qiáng)大沒有實用性,就失去了意義,只會制造更多的問題。
好多人都是做WEB這塊的,可能會忽略一些特殊領(lǐng)域,比如我們這些做智能終端設(shè)備相關(guān)項目的。現(xiàn)在很多智能終端系統(tǒng),例如我們常用的快遞柜、取票機(jī)等。基本上操作系統(tǒng)都采用了Android或者Linux系統(tǒng),硬件采用ARM主板和一堆的控制板。基本上甲方都需要加一些系統(tǒng)定制的內(nèi)容,比如狀態(tài)欄隱藏、外設(shè)驅(qū)動適配等,這些都是系統(tǒng)級,采用C/C++/Java完成內(nèi)核和系統(tǒng)的定制,這個沒什么說的。重點是對這一堆控制板的底層接口、邏輯控制和上層接口的實現(xiàn)。以前我們都是采用APP里的NDK來實現(xiàn),大量代碼耗費在Java和C++的相互調(diào)用上。后來直接采用C/C++直接編譯為可執(zhí)行文件通過遠(yuǎn)程調(diào)用提供給上層,開發(fā)效率有所提升。
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返回,其他的代碼幾乎是一模一樣
對比于其他語言的程序,Go語言的跨平臺能力是真的強(qiáng),拿.Net和JAVA來說吧,.Net在.Net core出現(xiàn)之前是不能跨平臺的,只能在windows上編譯運行,即使是.net core出現(xiàn)以后,跨平臺的程序也是相當(dāng)?shù)穆闊?。而java雖然一直都可以跨平臺,但是運行JAVA程序的機(jī)器上也必須要有JAVA程序運行環(huán)境JRE。而相對于Go程序,跨平臺就簡單的多了,只需要在編譯指定目標(biāo)程序運行的架構(gòu)和環(huán)境即可編譯出指定操作系統(tǒng)和架構(gòu)的程序。
以上是指定了go的環(huán)境變量后執(zhí)行的go build命令進(jìn)行目標(biāo)程序的構(gòu)建,這種方式會一直生效的,如果不讓他一直生效,可以在構(gòu)建的時候臨時指定環(huán)境變量,下面以window的環(huán)境為例,來介紹臨時指定環(huán)境變量的方式構(gòu)建可以在Linux環(huán)境下運行的可執(zhí)行程序:
可以根據(jù)不同的架構(gòu)和操作系統(tǒng)將其編寫為不同的.bat的可執(zhí)行文件放置在程序的根目錄,Linux的和MAC的也一樣編寫成腳本文件放置在程序的根目錄,這樣在構(gòu)建的時候就不用再敲命令了,直接運行腳本就可以了。
Java程序編譯打包后為war包或者是java包,必須執(zhí)行java -jar 命令或者將其放置到tomcat的指定目錄下,運行tomcat程序。而Go語言編寫的程序最終為可執(zhí)行的文件(window下編譯出的是.exe的可執(zhí)行文件),只需要將其賦予可執(zhí)行的權(quán)限就可以直接運行了。
構(gòu)建JAVA程序的鏡像需要指定java的基礎(chǔ)鏡像,否則就需要在鏡像中安裝java的運行環(huán)境了,下面展示的是構(gòu)建的一個JAVA程序的鏡像,構(gòu)建出來鏡像的體積相對比較大
而Go程序制作出的鏡像就不需要安裝任何的依賴環(huán)境,因為他在打包的時候就已經(jīng)將依賴的包一塊打包到一起了
拿著這個鏡像就可以到處運行了。
通過對比我們可以發(fā)現(xiàn),如果沒有之前的技術(shù)和業(yè)務(wù)的積累,重新開發(fā)一個新的項目,使用go去開發(fā)無疑是最容易上手的,所以現(xiàn)在很多公司都使用go進(jìn)行開發(fā),也逐漸將其他語言的項目逐步的用go語言進(jìn)行改造。其實用什么語言不重要,合適的才重要,開發(fā)項目在選擇語言的時候也會綜合多方面來考慮選擇合適的語言和架構(gòu),畢竟很多公司都不是搞研究的,都需要項目來賺錢,所以開發(fā)的速度、客戶的滿意度、項目交付的時間才是驅(qū)動公司技術(shù)的主要因素。
我們個人也應(yīng)該不斷完善自己的技術(shù)棧,不應(yīng)該太依靠某種語言,最重要的還是自己的架構(gòu)思想和底層架構(gòu)知識,只有掌握了這些才能夠不被 社會 和公司“優(yōu)化”。