Go的內(nèi)存回收還不是很完善。這對(duì)內(nèi)存捉雞的移動(dòng)設(shè)備是不小的弊端,因?yàn)閮?nèi)存貴而且越大越費(fèi)電。雖說(shuō)JAVA內(nèi)存管理也好不到哪去,但是在對(duì)性能敏感的地方可以換JNI。
成都創(chuàng)新互聯(lián)成立于2013年,我們提供高端網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站定制、網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣、小程序開(kāi)發(fā)、微信公眾號(hào)開(kāi)發(fā)、seo優(yōu)化排名服務(wù),提供專(zhuān)業(yè)營(yíng)銷(xiāo)思路、內(nèi)容策劃、視覺(jué)設(shè)計(jì)、程序開(kāi)發(fā)來(lái)完成項(xiàng)目落地,為成都酒店設(shè)計(jì)企業(yè)提供源源不斷的流量和訂單咨詢(xún)。
所以性能上Go是很尷尬的。
加上Go的資源不如JAVA豐富,IDE不如IntelliJ 成熟,Go用來(lái)開(kāi)發(fā)只是說(shuō)說(shuō)而已。
所以開(kāi)發(fā)效率Go根本不能和JAVA比。
個(gè)人認(rèn)為Google目前需要的是類(lèi)C#的兼具功能、性能、可移植性強(qiáng)的Native語(yǔ)言。
Go語(yǔ)言由Google公司開(kāi)發(fā),并于2009年開(kāi)源,相比Java/Python/C等語(yǔ)言,Go尤其擅長(zhǎng)并發(fā)編程,性能堪比C語(yǔ)言,開(kāi)發(fā)效率肩比Python,被譽(yù)為“21世紀(jì)的C語(yǔ)言”。
Go語(yǔ)言在云計(jì)算、大數(shù)據(jù)、微服務(wù)、高并發(fā)領(lǐng)域應(yīng)用應(yīng)用非常廣泛。BAT大廠正在把Go作為新項(xiàng)目開(kāi)發(fā)的首選語(yǔ)言。
Go語(yǔ)言應(yīng)用范圍:
1、服務(wù)端開(kāi)發(fā):以前你使用C或者C++做的那些事情,用Go來(lái)做很合適,例如日志處理、文件系統(tǒng)、監(jiān)控系統(tǒng)等;
2、DevOps:運(yùn)維生態(tài)中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go語(yǔ)言開(kāi)發(fā);
3、網(wǎng)絡(luò)編程:大量?jī)?yōu)秀的Web框架如Echo、Gin、Iris、beego等,而且Go內(nèi)置的 net/http包十分的優(yōu)秀;
4、Paas云平臺(tái)領(lǐng)域:Kubernetes和Docker Swarm等;
5、分布式存儲(chǔ)領(lǐng)域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、區(qū)塊鏈領(lǐng)域:區(qū)塊鏈里面有兩個(gè)明星項(xiàng)目以太坊和fabric都使用Go語(yǔ)言;
7、容器虛擬化:大名鼎鼎的Docker就是使用Go語(yǔ)言實(shí)現(xiàn)的;
8、爬蟲(chóng)及大數(shù)據(jù):Go語(yǔ)言天生支持并發(fā),所以十分適合編寫(xiě)分布式爬蟲(chóng)及大數(shù)據(jù)處理。
go語(yǔ)言之所以能成為我國(guó)最火的語(yǔ)言,是因?yàn)榫帉?xiě)服務(wù)端高并發(fā)程序的優(yōu)勢(shì)。我大中華區(qū)但凡pv,日活高點(diǎn)的網(wǎng)站,應(yīng)用,誰(shuí)沒(méi)點(diǎn)這個(gè)需求。這個(gè)領(lǐng)域中最優(yōu)的幾個(gè):golang,erlang,rust。日常生活中人類(lèi)社交是當(dāng)今社會(huì)上的必然性,人們也伴隨著科技時(shí)代的發(fā)展,智能電子產(chǎn)品的使用中也必然少不了語(yǔ)言輸入,文字的編輯,語(yǔ)言轉(zhuǎn)換的便利都均可來(lái)源于go語(yǔ)音輸入法。
國(guó)內(nèi)大學(xué)本科教育,哪個(gè)學(xué)校不以c/c++為入門(mén)教學(xué)語(yǔ)言。都十幾年了,譚浩強(qiáng)還在大賣(mài)。語(yǔ)法相近的語(yǔ)言總是學(xué)習(xí)和使用成本最低的。這一點(diǎn)非常重要。coursera上有一門(mén)程序設(shè)計(jì)語(yǔ)言理論課上,開(kāi)篇就闡述了這一點(diǎn)的重要性。假設(shè)go的入門(mén)成本是一個(gè)月,erlang的入門(mén)成本是2個(gè)月,那么整個(gè)程序員群體在學(xué)習(xí)后者的付出成本就很可觀了。
google由于眾所周知的原因,在國(guó)內(nèi)程序員中不一般的地位。golang有個(gè)好背景。
go語(yǔ)言之前一直都沒(méi)有接受待見(jiàn),如今廣大的群眾開(kāi)始接待,因?yàn)轵v訊服務(wù)器段代碼編譯是支持go語(yǔ)言的
go語(yǔ)言會(huì)成為主流也是一個(gè)問(wèn)題,
多慮了,沒(méi)有競(jìng)爭(zhēng)來(lái)關(guān)系。
雖然go成為源了世界上最并發(fā)的語(yǔ)言,這并不妨礙php成為世界上最好的語(yǔ)言,
也不妨礙java成為世界上最有模式的語(yǔ)言,
更不會(huì)妨礙c++成為21天就能學(xué)會(huì)了的語(yǔ)言。為什么Go語(yǔ)言如此不受待見(jiàn)
其實(shí)并沒(méi)有不受待見(jiàn),用的人還是很多的,解決一些特定領(lǐng)域的問(wèn)題也很方便。
每種語(yǔ)言的流行程度主要取決于這個(gè)語(yǔ)言最著名的killerapp的流行程度,C有Linux,Go有Docker。
環(huán)境配置好復(fù)雜,我不得不嘮叨幾句。
需要下載golang1.4rc版,下載ndk,然后編譯。 然后用go get 下載gobind這個(gè)工具, 然后,將寫(xiě)好的代碼用gobind轉(zhuǎn)化下,然后使用特殊的編譯命令,將代碼編譯成.so文件,將生成的相關(guān)文件,放到android studio的項(xiàng)目中。然后java代碼中,利用jni調(diào)用引用的代碼。
... 好,接著往下看吧。
環(huán)境準(zhǔn)備
一臺(tái)Linux 64的機(jī)器
一個(gè)帶有AndroidStudioIDE的開(kāi)發(fā)機(jī)器
因?yàn)榄h(huán)境配置實(shí)在復(fù)雜,所以我們引入的docker。
docker pull codeskyblue/docker-goandroid
docker run --rm -ti codeskyblue/docker-goandroid bash
cd example; echo "view example projects
docker起來(lái)之后,什么就都配置好了,NDK啦,java啦,GO的環(huán)境變量了,等等,并且還預(yù)裝了vim,gradle,tmux,git,syncthing,svn
開(kāi)始寫(xiě)代碼
寫(xiě)代碼之前,先約定下目錄結(jié)構(gòu)
go的代碼都放在src/golib下,編譯使用make.bash編譯腳本,看下這個(gè)文件樹(shù)
.
|-- app.iml
|-- build.gradle
|-- libs/armeabi-v7a # go編譯生成的so文件
| `-- libgojni.so
|-- main.go_tmpl # 一個(gè)模板文件,先不用管它
|-- make.bash # 編譯腳本,用來(lái)生成.so和Java代碼
`-- src
|-- golib
| |-- hi
| | |-- go_hi?0?2?0?2?0?2 # 自動(dòng)生成的代碼
| | | `-- go_hi.go
| | `-- hi.go # 需要編寫(xiě)的代碼
| `-- main.go
`-- main
|-- AndroidManifest.xml
|-- java
| |-- go # 自動(dòng)生成的代碼
| | |-- Go.java
| | |-- Seq.java
| | `-- hi
| | `-- Hi.java
| `-- me/shengxiang/gohello # 主要的邏輯代碼
| `-- MainActivity.java
`-- res
我已經(jīng)寫(xiě)了一個(gè)例子,先直接搞下來(lái)
編譯下,試試行不行(就算不行問(wèn)題應(yīng)該也不大,因?yàn)榇髥?wèn)題都被我消滅了)
cd GoHello/app
./make.bash
../gradlew build
一切順利的話(huà)在build/outputs/apk下應(yīng)該可以看到app-debug.apk這個(gè)文件。(劇透下,這個(gè)文件只有800多K)
編譯好的我放到qiniu上了,可以點(diǎn)擊下載看看
下面可以嘗試改改,我拋磚引玉說(shuō)下
打開(kāi)hi.go這個(gè)文件
hi.go的內(nèi)容,比較簡(jiǎn)單,我們寫(xiě)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重新編譯下
打開(kāi)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();
}
});
編譯運(yùn)行下,把生成的apk安裝到手機(jī)上試試。
原理解讀(有興趣的接著看)
首先說(shuō)下gobind這個(gè)工具。
go_hi/go_hi.go這個(gè)文件時(shí)通過(guò)gobind這個(gè)工具生成的,用來(lái)配合一個(gè)簡(jiǎn)單的程序,生成.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)
}
這個(gè)簡(jiǎn)單的程序內(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這個(gè)包
import go.hi.Hi; // gobind生成的代碼
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Go.init(getApplicationContext()); // 初始化兩個(gè)線(xiàn)程
Hi.Hello("world");
}
}
其中有一句Go.init(...)這里再看go.Go這個(gè)包是什么樣子的
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()是一個(gè)native方法
}
}.start();
Go.waitForRun(); // 這個(gè)也是一個(gè)native方法
// 這部分可以理解為,啟動(dòng)了一個(gè)后臺(tái)線(xiàn)程不斷的接收結(jié)果到緩存中。
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");,打開(kāi)Hi.java路徑在src/go/hi/Hi.java,這個(gè)文件也是gobind生成的,是用來(lái)給java方便的調(diào)用.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); // 下面接著說(shuō)
}
private static final int CALL_Hello = 1;
private static final String DESCRIPTOR = "hi";
}
Seq.send這部分實(shí)際上最終調(diào)用的是一段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)
}
轉(zhuǎn)載僅供參考,版權(quán)屬于原作者。祝你愉快,滿(mǎn)意請(qǐng)采納哦
安卓App用Java和Kotlin作為開(kāi)發(fā)語(yǔ)言。
Google IO 2017宣布了 Kotlin 會(huì)成為 Android 官方開(kāi)發(fā)語(yǔ)言。在Kotlin 語(yǔ)言出現(xiàn)之前,幾乎所有的安卓應(yīng)用程序都是使用Java語(yǔ)言編寫(xiě)的。
擴(kuò)展資料
Google在今年I/O2017開(kāi)發(fā)者大會(huì)中宣布,正式把Kotlin納入Android程序的一級(jí)開(kāi)發(fā)語(yǔ)言(First-classlanguage),并與開(kāi)發(fā)團(tuán)隊(duì)JetBrains合組非牟利基金會(huì)推廣Kotlin。據(jù)多間外國(guó)媒體報(bào)導(dǎo),這是GoogleI/O開(kāi)發(fā)者大會(huì)中引來(lái)最多歡呼聲的消息。
Kotlin將于AndroidStudio3.0得到支持,JetBrians指開(kāi)發(fā)者不用再安裝額外元件或擔(dān)心兼容問(wèn)題。Kotlin能與Java互通,但擁有Java不支持的功能。Google相信利用Kotlin可使Android程序開(kāi)發(fā)更快捷有趣,但他們補(bǔ)充,此舉絕非取代Java和C++的官方支持。
可以。
Go 是一個(gè)新的并沒(méi)有多少用戶(hù)的語(yǔ)言,但是 Obective-C同樣。Google 是 Go 語(yǔ)言的奠基人,可以完全控制 Go 語(yǔ)言的發(fā)展。Go 是在 BSD 協(xié)議下發(fā)布的開(kāi)源語(yǔ)言,這意味著所有的開(kāi)發(fā)者可以在任何地方使用它。另外,Go 是一個(gè)操作系統(tǒng)級(jí)的語(yǔ)言。這里有一些關(guān)于 Go 的信息。
Go 語(yǔ)言在現(xiàn)有的系統(tǒng)編程語(yǔ)言環(huán)境遇到困難時(shí)誕生了。程序設(shè)計(jì)變得如此的困難,而選擇語(yǔ)言就是其中很大的一個(gè)原因。開(kāi)發(fā)者不得不選擇一個(gè)高效編譯、高效執(zhí)行且開(kāi)發(fā)簡(jiǎn)單的語(yǔ)言,而這三種特性在現(xiàn)代的語(yǔ)言中并不會(huì)同時(shí)存在。程序開(kāi)發(fā)者如果想選擇簡(jiǎn)單勝過(guò)安全的語(yǔ)言,可能轉(zhuǎn)向動(dòng)態(tài)類(lèi)型的語(yǔ)言,例如 Python、JavaScript 而不是C++、Java。Go 語(yǔ)言是一個(gè)試圖結(jié)合動(dòng)態(tài)類(lèi)型和靜態(tài)類(lèi)型,編譯效率和安全性以及語(yǔ)言的易用性等眾多特性與一體的一種嘗試。他的另一個(gè)目標(biāo)是支持現(xiàn)代的基于網(wǎng)絡(luò)的、基于多核的計(jì)算。最后,Go 還是非常快的,他可以在單個(gè)計(jì)算機(jī)上僅僅花費(fèi)幾秒時(shí)間構(gòu)建一個(gè)龐大的應(yīng)用程序。為了達(dá)到這些目標(biāo)需要解決這些語(yǔ)言問(wèn)題:靈活的類(lèi)型系統(tǒng)、并發(fā)的垃圾回收、強(qiáng)制的依賴(lài)規(guī)范等等。這些東西不是舊的語(yǔ)言一些庫(kù)或者工具可以處理的,這也就是他被稱(chēng)為新的編程語(yǔ)言的原因。