Go 語言是一個試圖結合動態(tài)類型和靜態(tài)類型,編譯效率和安全性以及語言的易用性等眾多特性與一體的一種嘗試。他的另一個目標是支持現(xiàn)代的基于網(wǎng)絡的、基于多核的計算。最后,Go 還是非??斓?,他可以在單個計算機上僅僅花費幾秒時間構建一個龐大的應用程序。使用GO語言開發(fā)android語言步驟如下:
網(wǎng)站建設哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了坪山免費建站歡迎大家使用!
1. 下載安裝Go語言(版本1.5+)
Golang鏈接
回到頂部
2. 下載安裝 gomobile
下載
$ go get golang.org/x/mobile/cmd/gomobile
安裝(需要等待幾分鐘)
gomobile init
回到頂部
3. Golang開發(fā)手機應用有兩種方式
a. 原生應用開發(fā)
$ go get -d golang.org/x/mobile/example/basic
主要應用領域:
應用控制管理與配置
OpenGL ES 2 綁定
Asset 管理
Event 管理
試驗中的包,含有OpenAL 綁定、音頻、字體、圖形以及運動傳感器
Android開發(fā)
$ gomobile build -target=android golang.org/x/mobile/example/basic
此命令會生成名為basic的apk安裝包
$ gomobile install golang.org/x/mobile/example/basic
此命令將安裝apk包到已連接的android設備
環(huán)境配置好復雜,我不得不嘮叨幾句。
需要下載golang1.4rc版,下載ndk,然后編譯。 然后用go get 下載gobind這個工具, 然后,將寫好的代碼用gobind轉化下,然后使用特殊的編譯命令,將代碼編譯成.so文件,將生成的相關文件,放到android studio的項目中。然后java代碼中,利用jni調用引用的代碼。
... 好,接著往下看吧。
環(huán)境準備
一臺Linux 64的機器
一個帶有AndroidStudioIDE的開發(fā)機器
因為環(huán)境配置實在復雜,所以我們引入的docker。
docker pull codeskyblue/docker-goandroid
docker run --rm -ti codeskyblue/docker-goandroid bash
cd example; echo "view example projects
docker起來之后,什么就都配置好了,NDK啦,java啦,GO的環(huán)境變量了,等等,并且還預裝了vim,gradle,tmux,git,syncthing,svn
開始寫代碼
寫代碼之前,先約定下目錄結構
go的代碼都放在src/golib下,編譯使用make.bash編譯腳本,看下這個文件樹
.
|-- app.iml
|-- build.gradle
|-- libs/armeabi-v7a # go編譯生成的so文件
| `-- libgojni.so
|-- main.go_tmpl # 一個模板文件,先不用管它
|-- make.bash # 編譯腳本,用來生成.so和Java代碼
`-- src
|-- golib
| |-- hi
| | |-- go_hi?0?2?0?2?0?2 # 自動生成的代碼
| | | `-- go_hi.go
| | `-- hi.go # 需要編寫的代碼
| `-- main.go
`-- main
|-- AndroidManifest.xml
|-- java
| |-- go # 自動生成的代碼
| | |-- Go.java
| | |-- Seq.java
| | `-- hi
| | `-- Hi.java
| `-- me/shengxiang/gohello # 主要的邏輯代碼
| `-- MainActivity.java
`-- res
我已經(jīng)寫了一個例子,先直接搞下來
編譯下,試試行不行(就算不行問題應該也不大,因為大問題都被我消滅了)
cd GoHello/app
./make.bash
../gradlew build
一切順利的話在build/outputs/apk下應該可以看到app-debug.apk這個文件。(劇透下,這個文件只有800多K)
編譯好的我放到qiniu上了,可以點擊下載看看
下面可以嘗試改改,我拋磚引玉說下
打開hi.go這個文件
hi.go的內(nèi)容,比較簡單,我們寫Go代碼主要就是這部分
// Package hi provides a function for saying hello.
package hi
import "fmt"
func Hello(name string) {
fmt.Printf("Hello, %s!\n", name)
return "(Go)World"
}
文件末尾添加下面這行代碼
func Welcome(name string) string {
return fmt.Sprintf("Welcome %s to the go world", name)
}
使用./make.bash重新編譯下
打開MainActivity.java 修改下OnClickListener事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = Hi.Welcome("yourname");
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
});
編譯運行下,把生成的apk安裝到手機上試試。
原理解讀(有興趣的接著看)
首先說下gobind這個工具。
go_hi/go_hi.go這個文件時通過gobind這個工具生成的,用來配合一個簡單的程序,生成.so文件
// go_hi.go
package go_hi
import (
"golang.org/x/mobile/bind/seq"
"example/hi"
)
func proxy_Hello(out, in *seq.Buffer) {
param_name := in.ReadUTF16()
hi.Hello(param_name)
}
func init() {
seq.Register("hi", 1, proxy_Hello)
}
這個簡單的程序內(nèi)容是這樣的
// main.go
package main
import (
"golang.org/x/mobile/app"
_ "golang.org/x/mobile/bind/java"
_ "example/hi/go_hi"
)
func main() {
app.Run(app.Callbacks{})
}
src/MyActivity.java文件內(nèi)容是這樣的
import ...
import go.Go; // 引入Go這個包
import go.hi.Hi; // gobind生成的代碼
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Go.init(getApplicationContext()); // 初始化兩個線程
Hi.Hello("world");
}
}
其中有一句Go.init(...)這里再看go.Go這個包是什么樣子的
public final class Go {
// init loads libgojni.so and starts the runtime.
public static void init(Context context) {
... 判斷該函數(shù)是否該執(zhí)行的代碼 -- 省略 --
System.loadLibrary("gojni"); // gojni需要這句
new Thread("GoMain") {
public void run() {
Go.run(); // run()是一個native方法
}
}.start();
Go.waitForRun(); // 這個也是一個native方法
// 這部分可以理解為,啟動了一個后臺線程不斷的接收結果到緩存中。
new Thread("GoReceive") {
public void run() { Seq.receive(); }
}.start();
}
private static boolean running = false;
private static native void run();
private static native void waitForRun();
}
MyActivity.java中還有段代碼是 Hi.Hello("world");,打開Hi.java路徑在src/go/hi/Hi.java,這個文件也是gobind生成的,是用來給java方便的調用.so文件
// Hi.java
// File is generated by gobind. Do not edit.
package go.hi;
import go.Seq;
public abstract class Hi {
private Hi() {} // uninstantiable
public static void Hello(String name) {
go.Seq _in = new go.Seq();
go.Seq _out = new go.Seq();
_in.writeUTF16(name);
Seq.send(DESCRIPTOR, CALL_Hello, _in, _out); // 下面接著說
}
private static final int CALL_Hello = 1;
private static final String DESCRIPTOR = "hi";
}
Seq.send這部分實際上最終調用的是一段go代碼
func Send(descriptor string, code int, req *C.uint8_t, reqlen C.size_t, res **C.uint8_t, reslen *C.size_t) {
fn := seq.Registry[descriptor][code]
in := new(seq.Buffer)
if reqlen 0 {
in.Data = (*[maxSliceLen]byte)(unsafe.Pointer(req))[:reqlen]
}
out := new(seq.Buffer)
fn(out, in)
seqToBuf(res, reslen, out)
}
如何部署Golang應用
安裝supervisord
# 通過載入程式 ez_setup.py 來安裝。這個載入程式會聯(lián)網(wǎng)下載最新版本setuptools來安裝,同時也可以更新本地的setuptools。
wget :peak.telemunity./dist/ez_setup.py
sudo python ez_setup.py
# 更新setuptools:
sudo python ez_setup.py -U setuptools
# 安裝supervisor
easy_install supervisor
# 生成配置檔案
echo_supervisord_conf /etc/supervisord.conf
# 編輯配置檔案
vim /etc/supervisord.conf
# 進入vim后找到最后兩行,開啟注釋(取消前面的分號),
# [include]
# files = supervisor.d/*.ini
# 將所有的supervisor配置都放到 /etc/supervisor.d目錄
mkdir /etc/supervisor.d
建立 supervisor 對應程式的配置檔案
其中的一些路徑需要換成自己對應的,這里將 zankbo 這個web 應用放在了對應的使用者目錄下
通過在生產(chǎn)伺服器上設定environment可以在程式里判斷是線上還是開發(fā)模式,如 zankbo 的 debug判斷
當然也可已在啟動命令處加入引數(shù),如 mand = /home/zankbo/gopath/src/zankbo/zankbo -d 來關閉Debug模式。
if os.Getenv("APP_NAME") == "ZANKBO_PRODUCT" {
beego.RunMode = "prod"
}
vim /etc/supervisor.d/zankbo.ini
# 寫入
[program:zankbo]
directory = /home/zankbo/gopath/src/zankbo
environment=APP_NAME="ZANKBO_PRODUCT"
mand = /home/zankbo/gopath/src/zankbo/zankbo
autostart = true
startsecs = 5
user = zankbo
redirect_stderr = true
stdout_logfile = /home/zankbo/log/zankbo.log
建立對應的使用者
useradd zankbo
# 將使用者加入到zankbo使用者組,Nginx以使用者執(zhí)行
usermod -a -G zankbo
# 更改使用者家目錄使用者組的許可權,使Nginx可以訪問
chmod g+rx /home/zankbo
部署Go環(huán)境
其中的目錄為,go:Go安裝目錄 gopath:Go工作目錄,下面有src、pkg、bin三個目錄 log:日志資料夾
[zankbo@MyCloudServer ~]$ pwd
/home/zankbo
[zankbo@MyCloudServer ~]$ vim .bashrc
# 設定Go環(huán)境變數(shù),在.bashrc檔案末尾寫下如下內(nèi)容
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bi
# 切換到使用者家目錄
[root@MyCloudServer ~]# su - zankbo
[zankbo@MyCloudServer ~]$ ls
go gopath log
將專案程式碼放到gopath/src下面,如我的播客專案:
[zankbo@MyCloudServer ~]$ tree -L 2 gopath/src/
gopath/src/
├── github.
│ ├── astaxie
│ ├── beego
│ ├── go-sql-driver
│ ├── howeyc
│ ├── jacobsa
│ ├── *** artystreets
│ └── wendal
└── zankbo
├── admin
├── blog
├── build_pkg.sh
├── mon
├── conf
├── controllers
├── dbstruct.mwb
├── main.go
├── models
├── static
├── views
└── zankbo
匯入專案sql檔案到資料庫
在專案資料夾執(zhí)行build
[zankbo@MyCloudServer zankbo]$ pwd
/home/zankbo/gopath/src/zankbo
[zankbo@MyCloudServer zankbo]$ go build
會在專案下生成與包名對應的可執(zhí)行檔案,這里為:zankbo,build的時候可能會遇到錯誤,比如mysql的密碼之類的,可根據(jù)提示排錯。
通過supervisor 來啟動服務
# supervisorctl start zankbo
配置Nginx
server {
listen 80;
server_name zankbo. zankbo.;
root /home/zankbo/gopath/src/zankbo;
error_log logs/zankbo..error.log warn ;
location /static/ {
root /home/zankbo/gopath/src/zankbo;
location ~ .*\.(js|css)$ {
aess_log off;
expires 1d;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
gzip off;
aess_log off;
expires 3d;
}
}
location / {
proxy_pass :127.0.0.1:8080;
}
}
如何部署thinkphp 應用
1、首先在官方網(wǎng)站下載ThinkPHP最新版本。
2、下載后的壓縮檔案解壓到WEB目錄(或者任何目錄都可以),框架的目錄結構為:
├─ThinkPHP.php 框架入口檔案
├─Common 框架公共檔案
├─Conf 框架配置檔案
├─Extend 框架擴充套件目錄
├─Lang 核心語言包目錄
├─Lib 核心類庫目錄
│ ├─Behavior 核心行為類庫
│ ├─Core 核心基類庫
│ ├─Driver 內(nèi)建驅動
│ │ ├─Cache 內(nèi)建快取驅動
│ │ ├─Db 內(nèi)建資料庫驅動
│ │ ├─TagLib 內(nèi)建標簽驅動
│ │ └─Template 內(nèi)建模板引擎驅動
│ └─Template 內(nèi)建模板引擎
└─Tpl 系統(tǒng)模板目錄
注意,框架的公共入口檔案ThinkPHP.php是不能直接執(zhí)行的,該檔案只能在專案入口檔案中呼叫才能正常執(zhí)行,這是很多新手很容易犯的一個錯誤。
3、接下來先在WEB根目錄下面建立一個app子目錄(這個就是app就是專案名),然后在該目錄下面建立一個index.php檔案,新增一行簡單的程式碼:
require '/ThinkPHP框架所在目錄/ThinkPHP.php';
這行程式碼的作用就是載入ThinkPHP框架的入口檔案ThinkPHP.php,這是所有基于ThinkPHP開發(fā)應用的第一步。然后,在瀏覽器中訪問這個入口檔案。
如何部署應用到was上
websphere的預設使用記憶體應該是256的 你的38的war包部署 不應該出現(xiàn)記憶體崩掉的問題呀。
部署系統(tǒng)也很簡單么,就是打成war包,記得打war包得時候要檢查web.xml的格式 websphere很在意這個東東的。
然后一步一步的部署就可以了。was慢 但是不會你那么慢得??梢再Nerror出來看看
如何部署python3 的應用
mod_python,這是apache內(nèi)建的模組,很嚴重的依賴于mod_python編譯使用的python版本,和apache配套使用,不推薦
cgi,這個太old,不推薦,而且nginx不支援cgi方式,只能用ligd或者apache
fastcgi ,這個是目前流行最廣的做法,通過flup模組來支援的,在nginx里對應的配置指令是 fastcgi_pass
spawn-fcgi,這個是fastcgi多程序管理程式,ligd安裝包附帶的,和
flup效果一樣,區(qū)別是flup是
python程式碼級引入,spawn-fcgi是外部程式。spawn-fcgi用途很廣,可以支援任意語言開發(fā)的代
碼,php,python,perl,只要你程式碼實現(xiàn)了fastcgi介面,它都可以幫你管理你的程序
scgi,全名是Simple Common Gateway Interface,也是cgi的替代版本,scgi協(xié)議很簡單,我覺得和fastcgi差不多,只是沒有怎么推廣開來,nginx對應的配置指令是scgi_pass,你想用就用,flup也支援。
,nginx使用proxy_pass轉發(fā),這個要求后端appplication必須內(nèi)建一個能處理高并發(fā)的 server,在python的web框架當中,只能選擇tornado.
python程式設計師喜歡發(fā)明輪子,tornado除了是一個web framework之外,它還可以單獨提供高效能
server,所以,如果你采用其他python框架寫程式碼,比如說bottle,也一樣可以通過import
tornado 來啟動一個高效能的
server,同樣的可以采用協(xié)議和nginx一起來部署。擴充套件開來,python包里面能處理高并發(fā)的
server還有很多,比如說gevent,也可以被其他框架引用來支援方式部署。
現(xiàn)實當中,用java來做web程式,通常就用和nginx配合,應用伺服器選擇tomcat或者jetty
uwsgi,包括4部分組成,
nginx從0.8.4開始內(nèi)建支援uwsgi協(xié)議,uwsgi協(xié)議非常簡單,一個4個位元組header+一個body,body可以是很多協(xié)議的
包,比如說,cgi等(通過header里面欄位標示),我曾經(jīng)做個一個小規(guī)模的效能對比測試,結果表明,uwsgi和fastcgi相比,效能
沒有太明顯的優(yōu)勢,也可能是資料集較小的原因
uwsgi的特點在于自帶的程序控制程式.它是用c語言編寫,使用natvie函式,其實和spawn-fcgi/php-fpm類似。所以uwsgi可以支援多種應用框架,包括(python,lua,ruby,erlang,go)等等
uwsgi協(xié)議
web server內(nèi)建支援協(xié)議模組
application伺服器協(xié)議支援模組
程序控制程式
Gunicorn,和uwsgi類似的工具,從rails的部署工具(Unicorn)移植過來的。但是它使用的協(xié)議是 WSGI,全稱是Python Web Server Gateway Interface ,這是python2.5時定義的官方標準(PEP 333 ),根紅苗正,而且部署比較簡單,:gunicorn./ 上有詳細教程
mod_wsgi,apache的一個module,也是支援WSGI協(xié)議,:code.google./p/modwsgi/
如何部署簡單python + flask應用
python是一款應用非常廣泛的指令碼程式語言,谷歌公司的網(wǎng)頁就是用python編寫。python在生物資訊、統(tǒng)計、網(wǎng)頁制作、計算等多個領域都體現(xiàn)出了強大的功能。python和其他指令碼語言如java、R、Perl 一樣,都可以直接在命令列里執(zhí)行指令碼程式。
所需工具:
python3.4
flask
nginx
gunicorn
supervisor
系統(tǒng)環(huán)境:
Ubuntu 14.04LTS
我們先寫一個最基本的flask應用:
demo.py
from flask import Flask
app = Flask(**name**)
@app.route('\')
def index():
return 'Hello World.'
if __name__ == __main__:
app.run()
執(zhí)行這個py檔案,開啟瀏覽器訪問127.0.0.1:5000就能看到顯示Hello World的頁面 .
如果讓這個flask引用監(jiān)聽來自公網(wǎng)ip的請求,理論上你跑此程式的機器就相當于一個伺服器了,然而這個伺服器并不完美,所以我們需要nginx和gunicorn來增加它的功能,讓它真刀真槍上生產(chǎn)環(huán)境的時候能按要求執(zhí)行。
flask自帶的WSGI框架效能很差勁,只能適用于開發(fā)環(huán)境除錯使用。我們用專業(yè)一點的gunicorn(還有很多其他優(yōu)秀的框架)替代flask自帶的WSGI框架。
配置完后,通過命令’/usr/local/bin/gunicorn -b127.0.0.1:5000‘啟動應用。開啟瀏覽器訪問127.0.0.1:5000,同樣能夠得到返回頁面
然而gunicorn也僅僅是一個python的WSGI框架而已,要讓它真正處理來自網(wǎng)際網(wǎng)路的各類訪問功能還是有點欠缺,這時候就需要用到大名鼎鼎的nginx 伺服器來替gunicorn遮風擋雨了。
Ubuntu下安裝nginx可以用命令
sudo apt-get install nginx
安裝后需要進行下配置:
cd /etc/nginx/sites-available
sudo vi test (test為配置名稱,可以根據(jù)自己專案進行命名)
test檔案的配置為:
server {
listen 80; # 監(jiān)聽80埠
location / {
proxy_pass :127.0.0.1:5000; # 代理本機127.0.0.1:5000的服務
}
location /static {
alias /home/ubuntu/myproject/myblog/app/static; # 負載均衡
}
}
cd ..
cd sites-enable
sudo ln -s ../sites-available/lwhile . (建立軟連結,別漏掉最后的.)
sudo service nginx reload
sudo service nginx restart
這樣nginx的基本配置檔案就寫好了 接下來我們配置程序管理工具supervisor supervisor可以在后面啟動你的python程序,這樣很方便
1.cd /etc/supervisor/conf.d
2.sudo vi test.conf (test為檔名)
[program:test]
mand = /usr/local/bin/gunicorn -b127.0.0.1:5000 /home/ubuntu/myproject/test.py
3.sudo supervisorctl
4.reload
5.start test
如果一切正常,做完這所有步驟之后,現(xiàn)在公網(wǎng)的ip訪問你的主機,就可以開啟你的flask應用了
python是一款應用非常廣泛的指令碼程式語言,谷歌公司的網(wǎng)頁就是用python編寫。python在生物資訊、統(tǒng)計、網(wǎng)頁制作、計算等多個領域都體現(xiàn)出了強大的功能。python和其他指令碼語言如java、R、Perl 一樣,都可以直接在命令列里執(zhí)行指令碼程式。工具/原料
python;CMD命令列;windows作業(yè)系統(tǒng)
方法/步驟
1、首先下載安裝python,建議安裝2.7版本以上,3.0版本以下,由于3.0版本以上不向下相容,體驗較差。
2、開啟文字編輯器,推薦editplus,notepad等,將檔案儲存成 .py格式,editplus和notepad支援識別python語法。
指令碼第一行一定要寫上 #!usr/bin/python
表示該指令碼檔案是可執(zhí)行python指令碼
如果python目錄不在usr/bin目錄下,則替換成當前python執(zhí)行程式的目錄。
3、編寫完指令碼之后注意除錯、可以直接用editplus除錯。除錯方法可自行百度。指令碼寫完之后,開啟CMD命令列,前提是python 已經(jīng)被加入到環(huán)境變數(shù)中,如果沒有加入到環(huán)境變數(shù),請百度
4、在CMD命令列中,輸入 “python” + “空格”,即 ”python “;將已經(jīng)寫好的指令碼檔案拖拽到當前游標位置,然后敲回車執(zhí)行即可。
go 可以開發(fā)桌面應用,但并不是很舒適。
可以使用的GUI庫有:
1、goqt,LiteIDE作者出品,Go和QT的綁定,還未發(fā)布
2、go.uik,純Go實現(xiàn)的并發(fā)UI工具
3、walk,Windows Application Library Kit
4、gform,Windows GUI framework
目前的話walk用得比較多
不過go的GUI庫用起來沒有C#、C/C++的那么順手。
這個問題不久之后應該會有所改善,畢竟用Go開發(fā)桌面的需求在不斷增加。
目前我采用的是用go http 做后端,Webkit+HTML5 做界面,表現(xiàn)力很好,前端不需要學習新知識,一般的管理類應用都能搞定。