使用go
go语言的好处不言而喻:
效率问题,无论是开发效率还是运行效率至少都兼顾了,比较适合中国国情。
运行可以以脚本运行,可以编译结果运行
跨平台没有大问题
javajava1.7 后的非阻塞做的可以了 大量I/O的情况下,还没有好的解决方案,可以使用分布式,中国后台大量使用了java,以至于不懂技术的人说到后台就认为是java
nodenode 很好,很喜欢,但是太脚本化,一般单线程运行,可以多进程运行,可以使用分布式,在运行脚本测试方面,其实比python更加快捷简单,效率高,当然并非使用python效率就不高,python的AI大量模块都是c,c++写的,node也是如此。
goGoroutine 很好,不多说,使用就行,同样可以使用分布式,各方面比较先进
c c++效率很好,可惜为此要引入的库时很不方便,编译一大堆库,要效率别无他法,尽量自己写代码,中国国情。。。。。
选择所以使用go node java,现在偏重于go,其他效率方面的,c 第一 没有之一,如 linus 写的git ,他用c 写东西,那就是开发效率和运行效率一样高。
例子,五分钟httpserve 和 mysql 准备好 show me the code 先写一个数据库连接获取数据的 package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
var DB *sqlx.DB
func initDb() error {
var err error
dsn := "root:root@tcp(127.0.0.1:3306)/test"
DB, err = sqlx.Open("mysql", dsn)
if err != nil {
return err
}
DB.SetMaxOpenConns(100)
DB.SetMaxIdleConns(16)
return nil
}
type User struct {
ID int64 `db:"ID"`
Name sql.NullString `db:"name"`
Age int `db:"age"`
}
func testSqlxQuery() {
sqlstr := "select ID,name,age from user where ID = ?"
var user User
err := DB.Get(&user, sqlstr, 1)
if err != nil {
fmt.Printf("select failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
}
func main() {
err := initDb()
if err != nil {
fmt.Printf("init db failed, err:%v\n", err)
return
}
testSqlxQuery()
}
运行立刻得到结果,速度效率兼顾,当然自己需要
加上httpserver,然后从httpserver返回结果
package main
import (
"github.com/gin-gonic/gin"
"fmt"
//"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
//"net/http"
)
var (
userName string = "root"
password string = "root"
ipAddrees string = "localhost"
port int = 3306
dbName string = "test"
charset string = "utf8"
)
type User struct {
ID int `db:"ID"`
Name string `db:"name"`
Age int `db:"age"`
Address string `db:"address"`
}
func getUser(Db *sqlx.DB) ([]User) {
var users []User // 这里创建的是存放结构体的切片
if err := Db.Select(&users, "select * from user where ID > ?", 0); err != nil {
fmt.Println("Select ERROR:", err)
return nil
}
fmt.Println(users)
return users
}
func getUserRecord(Db *sqlx.DB,id int64){
result, err := Db.Exec("select * from user where id = ?",id)
if err != nil {
fmt.Printf("delete faied, error:[%v]", err.Error())
return
}
num, _ := result.RowsAffected()
fmt.Printf("select success, affected rows:[%d]\n", num)
//return result()
}
func connectMysql() (*sqlx.DB) {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, password, ipAddrees, port, dbName, charset)
Db, err := sqlx.Open("mysql", dsn)
if err != nil {
fmt.Printf("mysql connect failed, detail is [%v]", err.Error())
return nil
}
Db.SetMaxOpenConns(20)
Db.SetMaxIdleConns(15)
return Db
}
func main() {
var Db *sqlx.DB = connectMysql()
if Db == nil{
fmt.Println("db error")
}
defer Db.Close()
x:=getUser(Db)
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "I am qianbo",
})
})
r.GET("/get/user",func(c *gin.Context){
c.JSON(200,gin.H{
"data":x,
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
浏览器里输入http://127.0.0.1:8080/get/user 可以看到返回的json结果,我会继续写完整,go 语言和c,c++配合来写系统,事半功倍。