Why Python

Python是一个很酷的编程语言,它极致的简洁,极易上手,我们可以用它来做云计算、大数据分析,运维自动化,当然还可以写网站、做爬虫。

Why not Python

但我们也清楚地知道它会受限于GIL,还好我们有gevent,我们可以很愉快地monkey.patch_all(),然后用greenlet来处理,但即使这样,在并发量极高的情况下,它的效率就有些令我们担心了。

Golang or OpenResty

当我们开始关注高性能高并发服务端实现的时候,我们自然而然地将目光转向一些现代化的技术,这就是Golang和OpenResty,当然他们的核心都是将IO复用与协程进行有机的融合,但却有着截然不同的表现风格。如果你要问我更喜欢哪个,我会说both。当然下文我会介绍Golang。

Golang

我的哲学是,要熟悉一个编程语言,就是要从最简单的代码开始写起来。百试不爽。

万年不变的hello world先放这。

hello.go

package main //包声明

import "fmt" //导入包

func main() {

fmt.Println("Hello, 世界")

}

package main

import (

"encoding/json"

"github.com/cloudflare/conf"

"gopkg.in/macaron.v1" //Web框架Macaron

"labix.org/v2/mgo"

"log"

"net/http"

"os"

"strconv"

)

// 声明包级别的变量

var (

MONGO_URL string

MONGO_DB string

)

// 包初始化函数init

func init() {

c, err := conf.ReadConfigFile("config.conf") //配置文件见config.conf

e(err, true)

MONGO_URL = c.GetString("MONGO_URL", "127.0.0.1:27017")

MONGO_DB = c.GetString("MONGO_DB", "test")

}

func e(err error, fatal bool) (ret bool) {

if err != nil {

log.Println(err.Error())

if fatal {

os.Exit(1)

}

return true

} else {

return false

}

}

func main() {

ms, err := mgo.Dial(MONGO_URL)

e(err, true)

defer ms.Close() //延迟到函数将要返回时执行

ms.SetMode(mgo.Monotonic, true)

mdb := ms.DB(MONGO_DB)

m := macaron.Classic()

m.Map(mdb)

m.Get("/", func(mdb *mgo.Database) string {

names, err := mdb.CollectionNames()

e(err, false)

body, err := json.Marshal(names)

e(err, false)

return string(body)

})

m.Get("/:col", func(mdb *mgo.Database, ctx *macaron.Context, req *http.Request) string {

req.ParseForm()

mcol := mdb.C(ctx.Params(":col"))

limit := 20

offset := 0

if t := req.FormValue("limit"); t != "" {

limit, err = strconv.Atoi(t)

e(err, false)

}

if t := req.FormValue("offset"); t != "" {

offset, err = strconv.Atoi(t)

e(err, false)

}

total_count, err := mcol.Find(nil).Count()

e(err, false)

items := []map[string]interface{}{}

iter := mcol.Find(nil).Skip(offset).Limit(limit).Iter()

for {

item := map[string]interface{}{}

if iter.Next(&item) {

// item := map[string]interface{}{} 不能写在这里,因为Map是引用类型

items = append(items, item)

} else {

break

}

}

dict := map[string]interface{}{

"meta": map[string]int{"total_count": total_count, "offset": offset, "limit": limit},

"data": items,

"msg": "success",

"code": 0,

}

body, err := json.Marshal(dict)

e(err, false)

return string(body)

})

m.Run()

}

config.conf

MONGO_URL=127.0.0.1:27017

MONGO_DB=devmgmt

package main

import (

"database/sql"

"fmt"

_ "github.com/go-sql-driver/mysql" //匿名导入

"io/ioutil"

"log"

"os"

"regexp"

"strings"

"time"

)

func e(err error, fatal bool) (ret bool) {

if err != nil {

log.Println(err.Error())

if fatal {

os.Exit(1)

}

return true

} else {

return false

}

}

var (

DBS = map[string]string{}

dbs = map[string]*sql.DB{}

)

func init() {

log.SetFlags(log.Flags() | log.Lshortfile)

bytes, err := ioutil.ReadFile("config.conf") //见config.conf

e(err, true)

str := string(bytes)

lines := strings.Split(str, "n")

reg, err := regexp.Compile(`s+`)

e(err, true)

for num, line := range lines {

if line == "" {

continue

}

if strings.HasPrefix(line, "#") {

continue

}

fields := reg.Split(line, -1)

if len(fields) != 2 {

log.Printf("Line %d is not match the config format.", num+1)

continue

}

dbname := fields[0]

dburi := fields[1]

DBS[dbname] = dburi

dbs[dbname] = init_db(dburi)

}

}

func init_db(uri string) *sql.DB {

db, err := sql.Open("mysql", uri)

e(err, true)

return db

}

func task(dbname string, db *sql.DB) {

for {

rows, err := db.Query("select id,info,time from information_schema.PROCESSLIST where time > 5 and command = 'Query';")

if err != nil {

log.Println(err.Error())

dbs[dbname] = init_db(DBS[dbname])

task(dbname, dbs[dbname])

break

}

for rows.Next() {

var id string

var info string

var time string

err = rows.Scan(&id, &info, &time)

if err != nil {

log.Println(err.Error())

} else {

log.Printf("[FOUND SQL]: '%s'@'%s' (ConnectionId: %s, Time: %s)", info, dbname, id, time)

_, err := db.Exec(fmt.Sprintf("kill %s;", id))

if err != nil {

log.Println(err.Error())

} else {

log.Printf("[KILLED SQL]: '%s'@'%s' (ConnectionId: %s, Time: %s)", info, dbname, id, time)

}

}

}

time.Sleep(1 * time.Second)

}

}

func main() {

for dbname, db := range dbs {

go task(dbname, db) //用go关键字创建goroutine

}

c := make(chan int)

}

config.conf

# 配置文件以#开头的为注释

# 配置行 为 数据库昵称和数据库uri的组合,中间以若干空白为分隔

db1(127.0.0.1) root:root.com@tcp(127.0.0.1:3306)/mysql?charset=utf8

vhost1 ds:root.com@tcp(192.2.3.143:3306)/mysql?charset=utf8

看个panic和recover的代码片段。

package main

import (

"fmt"

)

func PanicAndRecover(input string) (res string) {

defer func() {

if p := recover(); p != nil { //从panic中恢复

fmt.Printf("%T, %#vn", p, p)

res = "error" //defer中修改函数的返回值

}

}()

panic(input) //触发panic

return "normal"

}

func main() {

err := PanicAndRecover("ds")

fmt.Println(err)

}

package go_mongo

import (

"gopkg.in/mgo.v2"

"log"

"os"

)

type Mongo struct{

session *mgo.Session

}

func New(murls string) *Mongo {

ms, err := mgo.Dial(murls)

if err != nil {

log.Printf("mgo.Dial, %sn", err)

os.Exit(1)

}

return &Mongo{session: ms}

}

func (self *Mongo) Insert(mdbs string, mcols string, docs ...interface{}) error { //*Mongo类型的方法,docs是可变参数

mdb := self.session.DB(mdbs)

mcol := mdb.C(mcols)

return mcol.Insert(docs...)

}

在main.go中使用包github.com/Hevienz/go-mongo。

main.go

package main

import (

"github.com/Hevienz/go-mongo"

"github.com/Hevienz/go-utils" //下文介绍

"log"

)

func main() {

doc := map[string]interface{}{"ds": "cc"}

m := go_mongo.New("127.0.0.1:27017")

go_utils.Dir(m) //调用go_utils包的Dir方法

err := m.Insert("test", "ds", doc)

if err != nil {

log.Println(err)

}

}

用反射实现类似Python中的build-in函数dir。

https://github.com/Hevienz/go-utils

dir.go

package go_utils

import (

"reflect" //导入反射包

"fmt"

"strings"

)

func Dir(x interface{}) {

v := reflect.ValueOf(x)

t := v.Type()

fmt.Printf("type %sn", t)

for i := 0; i < v.NumMethod(); i++ {

methType := v.Method(i).Type()

fmt.Printf("func (%s) %s%sn", t, t.Method(i).Name,

strings.TrimPrefix(methType.String(), "func"))

}

}

其它重要的特性包括:接口,类型断言,类型分支,channel,互斥锁等,此处不再介绍。

python语言转换为go_从 Python 到 Golang-Go语言中文社区相关推荐

  1. python decimal 转换为float_在Python中将float转换为decimal类型

    我只是在玩数字游戏. 我发现Numpy提供了一个名为np.vectorize的函数,允许您获取一个函数并将其应用于Numpy数组. 在[23]中:import numpy as np import d ...

  2. c语言转换为stc程序,STC51单片机入门(C语言)

    以前老资料,可继续下载参考. 目   录 第1篇 单片机KEIL开发环境 第1章  点亮LED实例与经典延时程序介绍(看不懂就从第2章动手) 1.1 51单片机最小系统与芯片引脚图 1.2 点亮LED ...

  3. Python字符串转换为小写字母– str.lower()

    We can convert a string to lowercase in Python using str.lower() function. In this short tutorial, w ...

  4. c语言转换为python语言_python和c语言

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! c语言是编译型语言,经过编译后,生成机器码,然后再运行,执行速度快,不能跨平台, ...

  5. python julia go_挑战Python的四个语言:Swift、Go、Julia、R

    没什么是永恒的--包括编程语言.很多看起来可能是将来的佼佼者,到头来可能被人们遗忘.无论是因为不可抗拒的原因,还是因为自身发展的原因. Python时下正在"最热门的编程语言榜"上 ...

  6. c语言转换为python语言_【转】用C语言扩展Python的功能

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型 ...

  7. 开发语言特性对比 java python golang c# c++

    java的跨平台+c#的ide和语法+python的库+c++语言的性能+go语言的协程 python和java比 运行速度比java慢,java强大于改进n次的强大jre,但python在很多领域能 ...

  8. Python并非为AI而生,Golang将统治人工智能的下一个十年?

    过去几年,Python成为人工智能和数据科学领域最受欢迎的编程语言.但是随着5G时代的来临,生产环境对AI应用的性能要求越来越高,Python有点「力不从心」.天生支持并发的Golang应运而生,专家 ...

  9. python语言基础-Python语言基础01-初识Python

    1. Python简介 1.1 Python的历史 Python的创始人为吉多·范罗苏姆(荷兰语:Guido van Rossum) 1989年的圣诞节期间:吉多·范罗苏姆为了在阿姆斯特丹打发时间,决 ...

  10. python语言中文社区-python语言中文

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 为了得到一个可以正常返回的 url ,需要修改示例中的 secretid ...

最新文章

  1. MinkowskiEngine基准测试
  2. SQL Server : 如何让每次备份的目标文件文件名不一样
  3. python新特性赋值_变量与赋值_Python入门视频课程_Python视频-51CTO学院
  4. 环境搭建之八-- node.js, npm和yarn
  5. 开发板 pc机 虚拟机 三者之间如何互ping通
  6. 用google代替CSDN的博客搜索功能
  7. python入门基础知识教程-Python基础知识入门,这三个原则是你要知道的,还有教程...
  8. Shell学习笔记 - 环境变量配置文件(转)
  9. 深入::first-letter的研究
  10. vs2017常量文本字符串无法转换成char*
  11. Buttons——CSS按钮样式库
  12. mysql数据库时间字段看不懂_mysql数据库时间字段看不懂
  13. 微信小程序简介、发展史、小程序的优点、申请账号、开发工具、初识wxml文件和wxss文件
  14. 爬虫 动态生成useragent的功能 fake-useragent库
  15. 全国计算机二级c语言答案,全国计算机二级C语言试题及答案
  16. datagrid combobox 选择后显示valueField 而不是 textValue解决方法
  17. 快速备份和还原 MySQL 数据库的另一种方法
  18. c语言strcmp函数使程序终止,c语言strcmp函数如何使用
  19. AD18如何设置过孔直连、焊盘十字
  20. 计算机应用基础试题答案截图,《计算机应用基础》试题二

热门文章

  1. python知识图谱智能问答_机器人之基于知识图谱的智能问答机器人
  2. 【果壳笔记】生物信息学——陈小伟老师部分
  3. 基于知识图谱的智能问答项目
  4. java压缩图片thumbnails_Java压缩图片、减小图片文件体积大小,Thumbnails使用教程...
  5. Linux(Ubuntu系统)安装yum及源的更新(详细操作+文字描述!!!)
  6. 台式计算机没有外放声音,台式电脑外放无声音怎么办
  7. 买腾讯云服务器怎么选择
  8. 在腾讯云开通短信验证服务并完成群发消息测试
  9. 数据结构算法——1097. Hub Connection plan
  10. 分清frontal plane(额状面)、coronal plane(冠状面)、transverse plane(横断面)、sagittal plane(矢状面)