go語言1.6 Go語言圣經(jīng)

為什么go語言gc的時候要暫停整個程序

可以參考下這個。在stack scan階段有一小段stw,和mark termination階段要stw。之前要stw的mark和sweep階段都是并行的,不需要stw的了。

成都創(chuàng)新互聯(lián)專注于平度企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),商城建設(shè)。平度網(wǎng)站建設(shè)公司,為平度等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

里面也提到了1.5使用了write barrier的算法會導(dǎo)致吞吐量下降,1.6會根據(jù)實際使用情況平衡下延遲和吞吐量。

沒有stw也是可以的,但吞吐量會進(jìn)一步下降,未必是最佳選擇。

linux下怎么安裝Go開發(fā)環(huán)境

一、Go安裝使用

1、下載Go源碼包

上傳到/usr/local/src目錄下

2、編譯安裝Go到/usr/local

tar zxvf go1.6.3.linux-amd64.tar.gz -C /usr/local/

#注:必須使用root賬戶或者使用sudo來解壓縮Go源碼包

3、設(shè)置PATH環(huán)境變量,添加/usr/local/go/bin到環(huán)境變量

export PATH=$PATH:/usr/local/go/bin

4、安裝到自定義位置

Go二進(jìn)制文件默認(rèn)安裝到/usr/local/go,但是可以安裝Go工具到不同的位置,可以自行定義,只需要設(shè)置正確的環(huán)境變量。

例如,安裝Go到家目錄下,必須添加環(huán)境變量到$HOME/.profile

export GOROOT=$HOME/go

export PATH=$PATH:$GOROOT/bin

注:安裝Go到其他目錄時,GOROOT必須設(shè)置為環(huán)境變量

5、檢查是否正確安裝程序

通過設(shè)置一個工作區(qū)和建立一個簡單的程序,檢查是否正確安裝了一個簡單的程序。創(chuàng)建一個目錄包含您的工作空間,例如/data/work,并設(shè)置GOPATH環(huán)境變量指向的位置。

export GOPATH=/data/work

#如果不存在/data/work,需要新建

然后,在你的工作內(nèi)創(chuàng)建src/github.com/user/hello,如果使用github,可以使用自己的用戶名代替user,在hello目錄下,新建hello.go

# cat hello.go

package main

import "fmt"

func main {

fmt.Printf("hello,world!\n")

}

#使用go編譯hello.go

go install github.com/user/hello

#上面的命令講名叫hello(or hello.exe)的程序放到你的工作區(qū)內(nèi),執(zhí)行下面命令,會得到輸出結(jié)果。

$GOPATH/bin/hello

hello,world!

#當(dāng)出現(xiàn)hello,world!表明Go已經(jīng)安裝成功可以工作。

二、Go工作區(qū)介紹

1、機(jī)構(gòu)組織代碼概述

Go語言程序通常將所有的代碼保存在一個工作區(qū)中。

工作區(qū)包含許多版本控制庫(由Git管理)。

每個存儲庫包含一個或多個包。

每個包由一個或多個在一個目錄中的源文件組成。

一個包的目錄的路徑?jīng)Q定其導(dǎo)入路徑。

注:同于其他的編程環(huán)境中,每一個項目都有一個獨立的工作區(qū)且工作區(qū)是緊密聯(lián)系在一起的版本控制庫。

2、工作區(qū)介紹

工作區(qū)是一個目錄層次結(jié)構(gòu),它的根目錄有三個目錄:

src 包含Go源文件

pkg 包含對象和包

bin 包含可執(zhí)行命令

Go工具創(chuàng)建源碼包并安裝二進(jìn)制文件到pkg和bin目錄下

src目錄通常包含多個版本控制庫(如Git或Mercurial),跟蹤一個或多個源包的開發(fā)。

下面展示一個好的工作區(qū)的例子:

bin/

hello # command executable

outyet # command executable

pkg/

linux_amd64/

github.com/golang/example/

stringutil.a # package object

src/

github.com/golang/example/

.git/ # Git repository metadata

hello/

hello.go # command source

outyet/

main.go # command source

main_test.go # test source

stringutil/

reverse.go # package source

reverse_test.go # test source

golang.org/x/image/

.git/ # Git repository metadata

bmp/

reader.go # package source

writer.go # package source

... (many more repositories and packages omitted) ...

上面的屬性圖展示了一個包含兩個存儲庫(example和image)的工作區(qū),example 存儲庫包含兩個命令(hello,outyet),image庫包含bmp包和幾個其他的包。

一個典型的工作區(qū)包含包含許多軟件包和命令的多個源庫。大多數(shù)程序員將所有的源代碼和依賴關(guān)系保存在一個工作區(qū)中

3、GOPATH環(huán)境變量設(shè)置

GOPATH環(huán)境變量指定工作區(qū)的位置。它很可能是唯一的環(huán)境變量,代碼開發(fā)時需要設(shè)置。

開始,創(chuàng)建一個工作區(qū)目錄并設(shè)置相應(yīng)的gopath。您的工作區(qū)可以位于任何你喜歡的地方,但我們將在這個文檔中使用/data/work。請注意,這不能是您的“Go安裝”路徑相同。

mkdir -p /data/work

export GOPATH=/data/work

為了方便。添加工作區(qū)的bin到PATH中

export PATH=$PATH:$GOPATH/bin

4、導(dǎo)入路徑

一個導(dǎo)入路徑是唯一標(biāo)識一個包的字符串。一個包的導(dǎo)入路徑對應(yīng)于它在工作區(qū)內(nèi)或遠(yuǎn)程存儲庫中的位置。

從標(biāo)準(zhǔn)庫的軟件包中給出了短的導(dǎo)入路徑等。對于您自己的包,您必須選擇不可能和未來添加到標(biāo)準(zhǔn)庫或其他外部庫的基礎(chǔ)路徑?jīng)_突的路徑。

注意,你不需要將你的代碼發(fā)布到一個遠(yuǎn)程存儲庫之前,你可以建立它。這只是一個很好的習(xí)慣來組織你的代碼,如果你有一天會出版它。在實踐中,你可以選擇任何任意的路徑名稱,只要它是唯一的標(biāo)準(zhǔn)庫和更大的去生態(tài)系統(tǒng)。

我們將使用github.com/user作為我們的基本路徑。在您的工作區(qū)中創(chuàng)建一個目錄,以保持源代碼:

mkdir -p $GOPATH/src/github.com/user

5、第一個項目

編譯并運行一個簡單的程序,首先選擇一個包的路徑(我們將使用github.com/user/hello)和創(chuàng)建在您的工作區(qū)相應(yīng)的軟件包目錄:

mkdir $GOPATH/src/github.com/user/hello

創(chuàng)建名叫hello.go的文件,上面創(chuàng)建過,此處略過。

cd $GOPATH/src/github.com/user/hello

go install

$GOPATH/bin/hello

或者:

hello

如果你使用的是一個源代碼管理系統(tǒng),現(xiàn)在是一個很好的時間來初始化一個存儲庫,添加文件,并提交你的第一次更改。再次,這一步是可選的:您不需要使用源代碼管理來寫代碼。

cd $GOPATH/src/github.com/user/hello

git init

Initialized empty Git repository in /data/work/src/github.com/user/hello/.git/

git add hello.go

git commit -m "first commit"

[master (root-commit) bbfb477] first commit

6、first library

mkdir $GOPATH/src/github.com/user/stringutil

下一步,在目錄下創(chuàng)建一個名為reverse.go文件中有下列內(nèi)容:

// Package stringutil contains utility functions for working with strings.

package stringutil

// Reverse returns its argument string reversed rune-wise left to right.

func Reverse(s string) string {

r := []rune(s)

for i, j := 0, len(r)-1; i len(r)/2; i, j = i+1, j-1 {

r[i], r[j] = r[j], r[i]

}

return string(r)

}

使用go build測試包的編譯

$ go build github.com/user/stringutil

如果當(dāng)前位置源碼包目錄,只需要:

go build

上面操作并不會產(chǎn)生一個輸出文件,必須使用go install,把包和對象輸出到工作去的pkg目錄內(nèi)

確認(rèn)stringutil包創(chuàng)建完成后,修改原始hello.go,使用stringutil包:

package main

import (

"fmt"

"github.com/user/stringutil"

)

func main() {

fmt.Printf(stringutil.Reverse("\n !oG ,olleH"))

}

無論使用go安裝包還是二進(jìn)制文件,所有相關(guān)的依賴都會自動安裝。所以當(dāng)你安裝hello程序時:

$ go install github.com/user/hello

對應(yīng)的stringutil包會自動安裝好。

執(zhí)行新的hello程序,可以看到消息已經(jīng)被反轉(zhuǎn)

# hello

Hello, Go!

完成上面操作之后,工作區(qū)應(yīng)該為:

├── bin

│ └── hello # command executable

├── pkg

│ └── linux_amd64 # this will reflect your OS and architecture

│ └── github.com

│ └── user

│ └── stringutil.a # package object

└── src

└── github.com

└── user

├── hello

│ └── hello.go # command source

└── stringutil

└── reverse.go # package source

注意:go install會把庫文件stringutil.a放到pkg/linux_amd64下邊(目錄結(jié)構(gòu)跟源代碼結(jié)構(gòu)一樣)。這樣可以go命令可以直接找到對應(yīng)的包對象,避免不必要的重復(fù)編譯。linux_amd64是為了根據(jù)操作系統(tǒng)和你的系統(tǒng)架構(gòu)交叉編譯。

所有Go可執(zhí)行程序都通過靜態(tài)方式鏈接在一起,所以在運行時是不需要相關(guān)的包對象(庫)。

7、包命令

所有的Go源代碼都以下面的語句開始:

package name

其中name就是包引用默認(rèn)的名稱,一個包中的所有文件必須使用同一個包名,可執(zhí)行命令必須是main。

一個二進(jìn)制文件下所有的包名不需要唯一,但是引用路徑必須唯一

8、測試

Go自帶了一個輕量級的測試框架,由go test和testing包組成。

可以通過新建xx_test.go寫一個測試,其中包含若干個TestXXX函數(shù)。測試框架會自動執(zhí)行這些函數(shù);如果函數(shù)中包含tError或t.Fail, 對應(yīng)的測試會被判為失敗。

添加一個針對stringutil的測試文件$GOPATH/src/github.com/user/stringutil/reverse_test.go,包含以下內(nèi)容:

package stringutil

import "testing"

func TestReverse(t *testing.T) {

cases := []struct {

in, want string

}{

{"Hello, world", "dlrow ,olleH"},

{"Hello, 世界", "界世,olleH"},

{"", ""},

}

for _, c := range cases {

got := Reverse(c.in)

if got != c.want {

t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)

}

}

}

#通過go test測試

# go test github.com/user/stringutil

ok github.com/user/stringutil 0.002s

#同樣的,在包文件夾下可以忽略路徑而直接執(zhí)行g(shù)o test

[root@zabbix stringutil]# go test

PASS

ok github.com/user/stringutil 0.002s

9、遠(yuǎn)程包

包的引用路徑用來描述如何通過版本控制系統(tǒng)獲取包的源代碼。go工具通過引用路徑自動從遠(yuǎn)程代碼倉庫獲取包文件。比如本文中用的例子也對應(yīng)的保存在github.com/golang/example下。go可以通過包的代碼倉庫的url直接獲取、生成、安裝對應(yīng)的包。

[root@zabbix ~]# go get github.com/golang/example/hello

[root@zabbix ~]# $GOPATH/bin/hello

Hello, Go examples!

如果工作區(qū)中不存在對應(yīng)的包,go會將對應(yīng)的包放到GOPATH環(huán)境變量指明的工作區(qū)下。(如果包已經(jīng)存在,go跳過代碼拉去而直接執(zhí)行g(shù)o install)

建議詳細(xì)看一下這個,有圖文

Go語言之Context

golang在1.6.2的時候還沒有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫中。中文譯作“上下文”,它主要包含了goroutine 的運行狀態(tài)、環(huán)境等信息。

context 主要用來在 goroutine 之間傳遞上下文信息,包括:同步信號、超時時間、截止時間、請求相關(guān)值等。

該接口定義了四個需要實現(xiàn)的方法:

如果有個網(wǎng)絡(luò)請求Request,然后這個請求又可以開啟多個goroutine做一些事情,當(dāng)這個網(wǎng)絡(luò)請求出現(xiàn)異常和超時時,這個請求結(jié)束了,這時候就可以通過context來跟蹤這些goroutine,并且通過Context來取消他們,然后系統(tǒng)才可回收所占用的資源。

為了更方便的創(chuàng)建Context,包里頭定義了Background來作為所有Context的根,它是一個emptyCtx的實例。

Background返回一個非空的Context。它永遠(yuǎn)不會被取消。它通常用來初始化和測試使用,作為一個頂層的context,也就是說一般我們創(chuàng)建的context都是基于Background。

TODO返回一個非空的Context。當(dāng)不清楚要使用哪個上下文的時候可以使用TODO。

他們兩個本質(zhì)上都是emptyCtx結(jié)構(gòu)體類型,是一個不可取消,沒有設(shè)置截止時間,沒有攜帶任何值的Context。

有了如上的根Context,那么是如何衍生更多的子Context的呢?這就要靠context包為我們提供的With系列的函數(shù)了。

通過這些函數(shù),就創(chuàng)建了一顆Context樹,樹的每個節(jié)點都可以有任意多個子節(jié)點,節(jié)點層級可以有任意多個。

WithCancel函數(shù),最常用的派生 context 方法。該方法接受一個父 context。父 context 可以是一個 background context 或其他 context。

WithDeadline函數(shù),該方法會創(chuàng)建一個帶有 deadline 的 context。當(dāng) deadline 到期后,該 context 以及該 context 的可能子 context 會受到 cancel 通知。另外,如果 deadline 前調(diào)用 cancelFunc 則會提前發(fā)送取消通知。

WithTimeout和WithDeadline基本上一樣,這個表示是超時自動取消,是多少時間后自動取消Context的意思。

WithValue函數(shù)和取消Context無關(guān),它是為了生成一個綁定了一個鍵值對數(shù)據(jù)的Context,這個綁定的數(shù)據(jù)可以通過Context.Value方法訪問到,一般我們想要通過上下文來傳遞數(shù)據(jù)時,可以通過這個方法,如我們需要tarce追蹤系統(tǒng)調(diào)用棧的時候。

使用Context的程序應(yīng)遵循以下規(guī)則,以使各個包之間的接口保持一致:

1.不要將 Context 塞到結(jié)構(gòu)體里。直接將 Context 類型作為函數(shù)的第一參數(shù),而且一般都命名為 ctx。

2.不要向函數(shù)傳入一個 nil 的 context,如果你實在不知道傳什么,標(biāo)準(zhǔn)庫給你準(zhǔn)備好了一個 context:todo。

3.不要把本應(yīng)該作為函數(shù)參數(shù)的類型塞到 context 中,context 存儲的應(yīng)該是一些共同的數(shù)據(jù)。例如:登陸的 session、cookie 等。

4.同一個 context 可能會被傳遞到多個 goroutine,別擔(dān)心,context 是并發(fā)安全的。

使用Go 語言開發(fā)大型 MMORPG 游戲伺服器怎么樣

使用Go 語言開發(fā)大型 MMORPG 游戲伺服器怎么樣

如果是大型網(wǎng)路游戲的話,我覺得是不合適的?,F(xiàn)階段go語言的執(zhí)行效率還是太低了。在底層編譯器的優(yōu)化方面做得和c++相比還是差了不少。go語言也是比較適合快速開發(fā)的專案比較合適

從2013年起,經(jīng)朋友推薦開始用Golang編寫游戲登陸伺服器, 配合C++做第三方平臺驗證. 到編寫?yīng)毩⒐ぞ邔?dǎo)表工具GitHub - davyxu/tabtoy: 跨平臺的高效能便捷電子表格匯出器. 以及網(wǎng)路庫GitHub - davyxu/cell: 簡單,方便,高效的Go語言的游戲伺服器底層. 最終使用這些工具及庫編寫整個游戲伺服器框架, 我的感受是很不錯的

細(xì)節(jié)看來, 有如下的幾個點:

語言, 庫

Golang語言特性和C很像, 簡單, 一張A4紙就能寫完所有特性. 你想想看, C++到了領(lǐng)悟階段, 也只用那幾個簡單特性, 剩下的都是一大堆解決各種記憶體問題的技巧. 而Golang一開始就簡單, 何必浪費生命去研究那一大堆的奇技淫巧呢?

Golang的坑只有2個:1. interface{}和nil配合使用, 2. for回圈時, 將回圈變數(shù)引入閉包(Golang, Lua, C#閉包變數(shù)捕獲差異) 完全不影響正常使用, 復(fù)合語言概念, 只是看官方后面怎么有效的避免

用Golang就忘記繼承那套東西, 用組合+介面

用Golang伺服器如何保證解決游戲伺服器存檔一致性問題? s the world是肯定的, 但是Golang可以從語言層并發(fā)序列化玩家資料, 再通過后臺存檔

channel是goroutine雖然是Golang的語言特性. 但是在編寫伺服器時, 其實只有底層用的比較多.

Golang的第三方庫簡直多如牛毛, 好的也很多

不要說模板了, C#的也不好用, 官方在糾結(jié)也不要加, 使用中, 沒模板確實有點不方便. 用interface{}/反射做泛型對于Golang這種強(qiáng)型別語言來說,還是有點打臉

執(zhí)行期

Golang和C++比效能的話, 這是C++的優(yōu)勢, Golang因為沒虛擬機(jī)器, 只有薄薄的一層排程層. 因此效能是非常高的, 用一點效能犧牲換開發(fā)效率, 妥妥的

1.6版后的GC優(yōu)化的已經(jīng)很好了, 如果你不是高效能,高并發(fā)Web應(yīng)用, 非要找出一堆的優(yōu)化技巧的話. 只用Golang寫點游戲伺服器, 那點GC損耗可以忽略不計

和其他現(xiàn)代語言一樣, 崩潰捕捉是標(biāo)配功能, 我用Golang的伺服器線上跑, 基本沒碰到過崩潰情況

熱更新: 官方已經(jīng)有plugin系統(tǒng)的提交, 跨平臺的. 估計很快就可以告別手動cgo做so熱更新

開發(fā), 除錯, 部署, 優(yōu)化

LiteIDE是我首選的Golang的IDE, 雖然有童鞋說B格不高. 但這估計實在是找不到缺點說了, 別跟我說Visual Studio, 那是宇宙級的...

曾經(jīng)聽說有人不看好Golang, 我問為啥: 說這么新的語言, 不好招人,后面打聽到他是個策劃... 好吧

真實情況是這樣的: Golang對于有點程式設(shè)計基礎(chǔ)的新人來說, 1周左右可以開始貢獻(xiàn)程式碼. 老司機(jī)2~3天.

開發(fā)效率還是不錯的, 一般大的游戲功能, 2*2人一周3~4個整完. 這換C++時代, 大概也就1~2個還寫不完. 對接伺服器sdk的話, 大概1天接個10多個沒問題

Golang自帶效能調(diào)優(yōu)工具, 從記憶體, CPU, 阻塞點等幾個方面直接出圖進(jìn)行分析, 非常直觀, 可以參考我部落格幾年前的分析: 使用Golang進(jìn)行效能分析(Profiling)

Golang支 *** 叉編譯, 跨平臺部署, 什么概念? linux是吧? 不問你什么版本, 直接windows上編譯輸出一個elf, 甩到伺服器上開跑.不超過1分鐘時間..

1.為什么golang的開發(fā)效率高?

golang是一編譯型的強(qiáng)型別語言,它在開發(fā)上的高效率主要來自于后發(fā)優(yōu)勢,不用考慮舊有惡心的歷史,又有一個較高的工程視角。良好的避免了程式設(shè)計師因為“ { 需不需要獨占一行 ”這種革命問題打架,也解決了一部分趁編譯時間找產(chǎn)品妹妹搭訕的階級敵人。

它有自己的包管理機(jī)制,工具鏈成熟,從開發(fā)、除錯到釋出都很簡單方便;

有反向介面、defer、coroutine等大量的syntactic sugar;

編譯速度快,因為是強(qiáng)型別語言又有g(shù)c,只要通過編譯,非業(yè)務(wù)毛病就很少了;

它在語法級別上支援了goroutine,這是大家說到最多的內(nèi)容,這里重點提一下。首先,coroutine并不稀罕,語言并不能超越硬體、作業(yè)系統(tǒng)實現(xiàn)神乎其神的功能。golang可以做到事情,其他語言也可以做到,譬如c++,在boost庫里面自己就有的coroutine實現(xiàn)(當(dāng)然用起來跟其他boost庫一樣惡心)。golang做的事情,是把這一套東西的使用過程簡化了,并且提供了一套channel的通訊模式,使得程式設(shè)計師可以忽略諸如死鎖等問題。

goroutine的目的是描述并發(fā)程式設(shè)計模型。并發(fā)與并行不同,它并不需要多核的硬體支援,它不是一種物理執(zhí)行狀態(tài),而是一種程式邏輯流程。它的主要目的不是利用多核提高執(zhí)行效率,而是提供一種更容易理解、不容易出錯的語言來描述問題。

實際上golang預(yù)設(shè)就是執(zhí)行在單OS程序上面的,通過指定環(huán)境變數(shù)GOMAXPROCS才能轉(zhuǎn)身跑在多OS程序上面。有人提到了網(wǎng)易的pomelo,開源本來是一件很不錯的事情,但是基于自己對callback hell的偏見,我一直持有這種態(tài)度:敢用nodejs寫大規(guī)模游戲伺服器的人,都是真正的勇士 : ) 。

2、Erlang與Golang的coroutine有啥區(qū)別,coroutine是啥?

coroutine本質(zhì)上是語言開發(fā)者自己實現(xiàn)的、處于user space內(nèi)的執(zhí)行緒,無論是erlang、還是golang都是這樣。需要解決沒有時鐘中斷;碰著阻塞式i\o,整個程序都會被作業(yè)系統(tǒng)主動掛起;需要自己擁有排程控制能力(放在并行環(huán)境下面還是挺麻煩的一件事)等等問題。那為啥要廢老大的勁自己做一套執(zhí)行緒放user space里面呢?

并發(fā)是伺服器語言必須要解決的問題;

system space的程序還有執(zhí)行緒排程都太慢了、占用的空間也太大了。

把執(zhí)行緒放到user space的可以避免了陷入system call進(jìn)行上下文切換以及高速緩沖更新,執(zhí)行緒本身以及切換等操作可以做得非常的輕量。這也就是golang這類語言反復(fù)提及的超高并發(fā)能力,分分鐘給你開上幾千個執(zhí)行緒不費力。

不同的是,golang的并發(fā)排程在i/o等易發(fā)阻塞的時候才會發(fā)生,一般是內(nèi)封在庫函式內(nèi);erlang則更夸張,對每個coroutine維持一個計數(shù)器,常用語句都會導(dǎo)致這個計數(shù)器進(jìn)行reduction,一旦到點,立即切換排程函式。

中斷介入程度的不同,導(dǎo)致erlang看上去擁有了preemptive scheduling的能力,而golang則是cooperative shceduling的。golang一旦寫出純計算死回圈,程序內(nèi)所有會話必死無疑;要有大計算量少i\o的函式還得自己主動叫runtime.Sched()來進(jìn)行排程切換。

3、golang的執(zhí)行效率怎么樣?

我是相當(dāng)反感所謂的ping\pong式benchmark,執(zhí)行效率需要放到具體的工作環(huán)境下面考慮。

首先,它再快也是快不過c的,畢竟底下做了那么多工作,又有排程,又有g(shù)c什么的。那為什么在那些benchmark里面,golang、nodejs、erlang的響應(yīng)效率看上去那么優(yōu)秀呢,響應(yīng)快,并發(fā)強(qiáng)?并發(fā)能力強(qiáng)的原因上面已經(jīng)提到了,響應(yīng)快是因為大量非阻塞式i\o操作出現(xiàn)的原因。這一點c也可以做到,并且能力更強(qiáng),但是得多寫不少優(yōu)質(zhì)程式碼。

然后,針對游戲伺服器這種高實時性的執(zhí)行環(huán)境,GC所造成的跳幀問題確實比較麻煩,前面的大神 @達(dá)達(dá) 有比較詳細(xì)的論述和緩解方案,就不累述了 。隨著golang的持續(xù)開發(fā),相信應(yīng)該會有非常大的改進(jìn)。一是遮蔽記憶體操作是現(xiàn)代語言的大勢所趨,它肯定是需要被實現(xiàn)的;二是GC演算法已經(jīng)相當(dāng)?shù)某墒?,效率勉勉?qiáng)強(qiáng)過得去;三是可以通過incremental的操作來均攤cpu消耗。

用這一點點效率損失換取一個更高的生產(chǎn)能力是不是值得呢?我覺得是值得的,硬體已經(jīng)很便宜了,人生苦短,讓自己的生活更輕松一點吧: )。

4、基于以上的論述,我認(rèn)為采用go進(jìn)行小范圍的MMORPG開發(fā)是可行的。

如果跟C語言比,大部分指令碼都勝出啊。Go, Node.js, Python ......

網(wǎng)易弄過一個Node.js的開源伺服器框架。

至于IDE, 不重要,做伺服器開發(fā)很少會要開著IDE除錯的。最常用的手段就是打Log. 設(shè)定了斷點也很難調(diào),多個客戶端并發(fā)。

那種單客戶端連線進(jìn)來就可以重現(xiàn)的bug倒是可以用IDE調(diào),但是這種bug本來就容易解決。

用指令碼語言,有一個很大的好處是容易做自動測試,可以更好地保證程式碼質(zhì)量。

--------------------------

開發(fā)效率當(dāng)然是指令碼高。執(zhí)行效率,其實更重要的是并發(fā),框架合理的話增加機(jī)器就可以直接提高效率增加人數(shù)。

用Go開發(fā)大型mmorpg服務(wù)端不會有問題的,如果掉坑里肯定不會是語言的問題。

唯一比較可能掉進(jìn)去的坑就只有GC,其實很容易預(yù)防和調(diào)整的,具體細(xì)節(jié)可以看我部落格分享的文章。

但是技術(shù)選型不只是選語言,如果當(dāng)時我手頭有一套效能滿意,開發(fā)效率OK,人員補(bǔ)給不會有問題的技術(shù)方案,不管是什么語言的,我肯定不會放棄它而選擇冒險的。

public void actionPerformed(ActionEvent e)

{

if(e.getSource()==xinjian)

{

text.setText("");

}

if(e.getSource()==dakai)

{

openFD.show();

String s;

本文題目:go語言1.6 Go語言圣經(jīng)
網(wǎng)址分享:http://muchs.cn/article20/dogiijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、App設(shè)計、企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司