golang的使用

Table of Contents

golang的使用

备注

今天翻旧资料的时候,突然发现14年的时候,折腾过golang实践某个项目。
以下是之前整理的PPT资料跟项目的简单介绍。
(太懒了,当时没记得整理。)

golang实践报告

现状
机器复用率低,怎么办?
1. 旧的开发架构性能低?
2. 需要更高的机器配置?
3. 有新的开发架构可以满足吗?

需求变化快,怎么办?
1.  旧的开发模式不适用?
2.  有更加敏捷的开发模式?
3.  需要更多的人?
对比
C/C++性能好,适合吗?
1. 开发周期长
2. 开发要求高
3. 人力成本高

java性能好,适合吗?
1. 开发周期长
2. 开发要求高
3. 人力成本高

lua性能好,适合吗?
1.  库少
2. 扩展成本高
3. 开发效率低
需求
1.  学习成本低,上手快
      降低开发人员要求
2.  性能高
      提高机器服务率,降低机器成本
3.  常用库有,无须造轮子
      增加开发效率
4.  扩展性强
5.  类型安全性高
6.  高并发计算
7.  内存使用安全
选择
1. 学习成本低,上手快
   Golang的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Golang,
从入门到能够上手做项目,最多不过半个月。Golang给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码
2. 性能高
   golang的qps 大约在 9675/s, 最高10200/s 左右 ,cpu利用率高峰在10.6% 
php的QPS大约是 1726/s, 最高2100/s 左右, cpu 高峰在50.1%
因多核利用,golang的”多线程”,  使得go在和php并发对比中遥遥领先,处理能力大约是php的4,5倍
3. 常用库有,无须造轮子
   如xml, asn1,json, IO库,压缩,加密库等,比较齐全,极大的方便了用户,并支持unicode
4. 扩展性强
   goroutine & channel提供了一种新的程序组织方式,更容易从设计上避免共享,在多核上更容易得到扩展性和伸缩性。
5. 类型安全性高
   强类型,显式类型转化 
6. 高并发计算
   Network+闭包+Goroutine+Channel
7. 内存使用安全
   支持垃圾回收机制
结论
开发模式JavaScript渲染前端+RESTful API的日益趋势,此开发模式更有利益前后端配合,更专注自己的强项,可提高开发效率。

php to golang需学习成本,由于golang学习成本低,上手快,故此成本比较低

golang更适合RESTful API(性能高),安全,并发高。比php性能,可以提高机器复用率,降低机器成本。
业务分析
1. 类似官网xx.com纯属web类型的业务,不建议使用html+RESTful API此开发模式,
因为不利于seo,可以使用golang + template(smarty转golang 模板引擎,需要一些学习成本),可以提高机器复用率,降低机器成本

2. 内嵌页类型的业务,可进行改造,使用JavaScript渲染前端+RESTful API(golang)开发模式,可以提高机器复用率,降低机器成本

3. 后台类型的业务,可以进行改造,使用html+RESTful API(golang)开发模式,前后端更好合作专注自己的领域,提高开发效率
问题
面对golang这年轻语言,是否可以很好的驾驭?

入门

预备知识
简介
Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率。 Go语言语法灵活、简洁、清晰、高效。
它对的并发特性可以方便地用于多核处理器 和网络开发,同时灵活新颖的类型系统可以方便地编写模块化的的系统。
go可以快速编译, 同时具有垃圾内存自动回收功能,并且还支持运行时反射。Go是一个高效、静态类型, 
但是又具有解释语言的动态类型特征的系统级语法。

应用
它最初的构想是作为一个系统编程语言,但目前也被用于像Web Server,存储架构等这类分布式、高并发系统中。
当然也可以用于一般的文字处理和作为脚本程序。Go的编译器作为Native Client被内嵌到Chrome浏览器中,可以被
Web应用程序用来执行本地代码;同时Go也可以运行在Intel和ARM的处理器上。目前已被Google集成到Google APP Engine中,
在基于Google App Engine基础设施的Web应用中也得到了很好的应用。目前GAE中仅支持三种应用程序开发语言:Java、Python和Go。(注:GAE的链接)
但不适合应用到对实时性要求很高的系统中,因为Go的内存模型是基于垃圾回收机制和原子内存分配。

功能
Google对Go寄予厚望。其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决若干物件取向程序设计的麻烦。
它具有现代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎但重要的内存管理问题。Go的速度也非常快,几乎和C或C++程序一样快,且能够快速制作程序。   
Go的网站就是用Go所建立,但Google有更大的野心。该软件是专为构建服务器软件所设计(如Google的Gmail)。Google认为Go还可应用到其他领域,
包括在浏览器内执行软件,取代目前JavaScript的角色。   
Pike说:它至少在强度上比JavaScript高一级。Google自建Chrome浏览器,部分原因就是加速JavaScript和网页表现,
而Google已经融合了本身的技术,如Native Client和Gears。   
Pike表示,Go另一项与网络相关的特色,是服务器和用户端设备,如PC或手机,可以分担工作。因此,使用Go的服务便可轻松适应不同的用户端处理性能。
Go也可解决目前的一大挑战:多核心处理器。一般电脑程序通常依序执行,一次进行一项工作,但多核心处理器更适合同步处理许多工作。
Pike说:我们自认有足够的支持,可改善这方面的问题。   Go团队正在寻求帮助。其中一个重要领域是改善Go能够使用的runtime library。
这类library可提供许多工具和功能,加快程序设计的过程。而Go的library还包括许多重要的设计元素,并供应处理同作、垃圾收集和其他低层杂务的资源。   
Go团队也需要编译器方面的协助。Thompson曾为32位元和64位元x86处理器,及ARM处理器写过一些编译器,Taylor也为GCC编译器写过一个Go前端。   
尽管Google对Go有很大的野心,该公司也明白,这项计划无法完全取代现有的技术。Pike说:我不认为我们能取代任何东西。我们只是创造出这个领域的另一个角色。

特点
简洁 快速 安全 并行 有趣 开源 支持泛型编程,内存管理,数组安全,编译迅速
Why GoLang
清晰并且简洁
Go 努力保持小并且优美,你可以在短短几行代码里做许多事情

并行
Go 让函数很容易成为非常轻量的线程。这些线程在 Go 中被叫做 goroutines

快速,高性能
编译很快,执行也很快。目标是跟 C 一样快。编译时间用秒计算

安全
当转换一个类型到另一个类型的时候需要显式的转换并遵循严格的规则。Go 有垃圾收集,在 Go 中无须 free(),语言会处理这一切

标准格式化
Go 程序可以被格式化为程序员希望的(几乎)任何形式,但是官方格式是存在的。标准也非常简单:gofmt 的输出就是官方认可的格式;
类型后置类型在变量名的后面,像这样 var a int,来代替 C 中的 int a;UTF-8任何地方都是 UTF-8 的,包括字符串以及程序代码。

开源
Go 的许可证是完全开源的,参阅 Go 发布的源码中的 LICENSE 文件

快速
PHP是一种功能强大的CGI脚本语言,语法是混合了C、Java、Perl和PHP式的新语法,执行网页的速度比CGI、Perl和ASP更快,这是它的第一个突出特点。
GO结合了动态语言的开发效率和静态编译型语言的安全性和运行效率,支持网络和多核编程。Go有着非常高的效率。

开放性和可扩展性
PHP属于自由软件,源代码完全公开,任何程序员为PHP扩展附加功能非常容易。
Go 的许可证是完全开源的,参阅 Go 发布的源码中的 LICENSE 文件

数据库支持
PHP支持多种主流与非主流的数据库,如:DBA、dBase、Informix、mSQL、MySQL、Microsoft SQL Server、Sybase、ODBC、PostgreSQL、Oracle等。
其中,PHP与MySQL是绝佳的组合,可以跨平台运行。
go语言提供了数据库访问的统一接口,但是自己自己的具体数据库访问驱动实现。
开源比较常用的有go-sql-driver/mysql(原来的go-mysql-driver)和mymysql。

面向对象编程
PHP提供了类和对象。为了实现面向对象编程,PHP 4.0及更高版本提供了新的功能和特性,包括对象重载、引用技术等。
go语言支持面向对象编程,但是不支持层次继承。
Golang本质上不是面向对象语言,它还是过程化的。但是,在Golang中, 你可以很轻易的做大部分你在别的OO语言中能做的事,
用更简单清晰的逻辑。是的,在这里,不需要class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO在Golang中,就是普通的struct操作。

丰富的功能
1. 对象式的设计
2. 结构化的特性
3. 数据库的处理
4. 网络接口的应用
5. 安全编码机制
6. 丰富的现成框架
7. 丰富的现成扩展
PHP几乎涵盖了所有网站的一切功能。

golang
1. 如xml, asn1,json, IO库,压缩,加密库等,比较齐全,极大的方便了用户
2.并支持unicode
3. 闭包:函数是第一类对象
4. Channel:CSP的核心思想是通过消息共享,而不是内存共享。
5. Goroutine:Goroutine是使并发编程变得容易的核心
6. Network支持 
7. Package模块管理
8. Cgo 支持C和Go语言编程混合,使得Go语言的扩展非常容易,让Cgo来做参数和类型转换,直接连接用户的C函数

伸缩性
传统上,网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不是很理想,因为它为每一个正在运行的CGI程序开一个独立进程。
解决方法就是将经常用来编写CGI程序的语言的解释器编译进Web服务器。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它
golang
goroutine & channel
提供了一种新的程序组织方式,更容易从设计上避免共享,在多核上更容易得到伸缩性。

成本低,上手快
学习php这门编程语言,入门其实是非常简单的,如果你以前有其他编程基础,那就更容易了---特别是有C语言基础的同学。php的总体语法方面非常相似与C语言。
Golang的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Golang,从入门到能够上手做项目,最多不过半个月。
Golang给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码也直接。
PHP to GoLang
  • Types
    <?php
    $name = "josephzeng";
    echo $name;
    $age = 18;
    echo $age
    ?>
    
    var name string
    name = "josephzeng"
    age := 20
    sex := "boy"
    //字符串转整形
    a, err := strconv.ParseInt("250")
    //整形转字符串
    a := fmt.Sprintf("%v", 123)
    
  • Objects
    <?php
        class User{
    public $name;
                        public $age;
    function __instruct($name, $age){
             $this->name = $name;
             $this->age = $age;
    }
    
    function getName(){
             return $this->getName;
    }
        }
        $u = new User("josephzeng", 18);
        var_dump($u);
        echo $u->getName()
            ?>
    
    type User struct{
    name string
    age int
    }
    func(u User)getName() string {
    return u.name
    }
    func main() {
    u := &User{name:"josephzeng",
    age:18}
    fmt.Println(u)
    pmt.Println(u.getName())
    }
    
  • Array/Maps
    <?php
        $arr = array("a", "b", "c");
        $map = array("name" => "josephzeng", "sex" => "boy");
            ?>
    
    arr := [3]string{"a", "b", "c"}
    
    arr := []string{"a", "b", "c"}
    
    m := map[string]string{
    "name":"josephzeng", 
    "sex":"boy",
    }
    
  • Package management
    arr := [3]string{"a", "b", "c"}
    
    arr := []string{"a", "b", "c"}
    
    m := map[string]string{
    "name":"josephzeng", 
    "sex":"boy",
    }
    
GoLang项目实践
GoLang环境搭建
略

开发模式
html + RESTful API,中间用JSON数据进行交互。

项目代码

目录结构
├── pkg
│   └── linux_amd64
│       └── github.com
├── public
│   ├── css
│   │   ├── base.css
│   │   └── main.css
│   ├── html
│   ├── images
│   │   ├── bs_head.jpg
│   │   ├── bs_loading.gif
│   │   ├── bs_logo.png
│   │   ├── bs_sidetips_loading.gif
│   │   └── bs_sprite.png
│   ├── js
│   │   ├── bs_config.js
│   │   ├── bs_global.js
│   │   ├── bs_init.js
│   │   ├── jns_calendar_v.1.min.js
│   │   └── jquery-1.11.0.min.js
│   ├── logs
│   └── prv
├── run.go
├── src
│   ├── github.com
│   │   ├── codegangsta
│   │   ├── go-martini
│   │   ├── go-sql-driver
│   │   ├── martini-contrib
│   │   ├── nsf
│   │   └── oxtoacart
│   ├── kugou
│   │   ├── kugou.go
│   │   ├── model.go
│   │   └── mysql.go
│   └── kugou.com
│       ├── test
│       └── vip
├── static
│   └── test.js
└── templates
    └── admin
        ├── index.html
        ├── recharge.html
        ├── testmysqladd.html
        ├── testmysqledit.html
        └── testmysqllist.html
代码片段
cat run.go
package main

import (
"kugou"
"kugou.com/test/demo"
"kugou.com/vip/admin"
//"net/http"
)

func main() {
kg := kugou.Kg
kugou.TplInit()
kg.Get("/admin/view", admin.AdminView)
kg.Get("/recharge/lists", admin.RechargeLists)
kg.Get("/recharge/one", admin.RechargeOne)
kg.Get("/recharge/delete", admin.RechargeDelete)
kg.Post("/test/mysqlsave", demo.DemoMysqlSave)
kg.Get("/test/mysqllists", demo.DemoMysqlLists)
kg.Post("/test/mysqldel", demo.DemoMysqlDel)
kg.Get("/admin.*", admin.AdminHome)
kg.Run()
}

######################
cat src/kugou/kugou.go
package kugou

import(
"github.com/go-martini/martini"
    "github.com/martini-contrib/render"
)

var Kg = martini.Classic()

func TplInit(){
Kg.Use(render.Renderer(render.Options{
Directory:"templates",
    Extensions:[]string {".html"},
Charset:"UTF-8",
}))
Kg.Use(martini.Static("static"))
}

...................

Author: josephzeng

Last Updated 2016-03-11. Created by Emacs 24.5.1 (Org mode 8.2.10)

Validate