2013/09/22

Go language!

Go語言是由Robert GriesemerRob PikeKen Thompson,這三位的最後一位算是一位蠻牛的人!
他與另外一位Dennis Ritchie設計了B語言以及C語言,也創造了unix作業系統!!
B語言是什麼?B語言就是C語言的前身

Dennis Ritchie是誰,他可是著名的C語言之父欸!這世界如果沒有Dennis RitchieKen Thompson創造出C語言,我們應該在寫組譯語言吧XD


不過Ken Thompson在Google工作可能也是遲早的吧!不過當初的貝爾實驗室培育出了許多人才的搖籃啊!


以上都是題外話,相信這次Ken Thompson設計的Go語言能夠改變現今的程式語言風潮,以下是2013程式語言前十名的排行榜



雖然Go語言沒有在前十名內,不過我仍看好Go語言未來的影響力!大牛出手,一定支持!






Go語言是在2007年由Google所開始設計的語言,在2009年轉為正式版本,且為開源的專案

Go語言是一種編譯以及平行處理,並具備垃圾處理功能的程式語言,不過Go語言寫法很雷同於C語言,但有些地方以及規範又跟C語言很不一樣,其For迴圈就會在本文的範例出現,你可以深刻體會到彼此的不同。
而且Go語言對於垃圾處理的機制又特別去優化,且Go語言的平行處理模型是以Tony HoareCSP作為基礎


該篇文章以『How to Write Go Code』作為程式碼範例

根據『How to Write Go Code』文內的這段話得知,須在開發資料夾底下具備src和pkg與bin
Go code must be kept inside a workspace. A workspace is a directory hierarchy with three directories at its root:
  • src contains Go source files organized into packages (one package per directory),
  • pkg contains package objects, and
  • bin contains executable commands.

src是拿來放原始碼的
pkg是類別的物件
bin則是可執行的命令

看完這段後,先將Go語言下載下來,在這邊我是以『go1.2rc1 Mac OS X (x86 64-bit) PKG installer』當做示範

下載下來之後,一直點繼續即可XD


安裝完成,先輸入以下的指令:
mkdir $HOME/go
mkdir $HOME/go/src $HOME/go/bin $HOME/go/pkg 
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin



接著輸入
mkdir $GOPATH/usr/demo/hello
vim $GOPATH/usr/demo/hello/hello.go


並將程式碼填入hello.go:
package main

import "fmt"

func main(){
        fmt.Printf("Hello, world\n");
}



import就像C語言的include,將標頭檔或函式庫導入
import "fmt"


我們來了解一下fmt的函式庫說明吧!
fmt有實作C語言中的I/O函式庫,有以下這幾種方法


func Errorf(format string, a ...interface{}) error
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
func Scan(a ...interface{}) (n int, err error)
func Scanf(format string, a ...interface{}) (n int, err error)
func Scanln(a ...interface{}) (n int, err error)
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
type Formatter
type GoStringer
type ScanState
type Scanner
type State
type Stringer


有興趣可以研究一下,接著輸入指令:
go run $GOPATH/usr/demo/hello


就會出現Hello, world了!



以上只是我們的第一隻程式而已喔,接下來要教的是寫第一個函式庫,先輸入以下指令:
mkdir $GOPATH/usr/demo/newmath
vim $GOPATH/usr/demo/newmath/Sqrt.go


將以下程式碼輸入到Sqrt.go內

package newmath

func Sqrt(x float64) float64{
 z := 1.0
 
 for i :=0; i < 1000; i++ {
  z -= (z*z - x) / (2 * z)
 }
 
 return z
}



輸入以下指令去build sqrt
go build $GOPATH/src/demo/newmath/sqrt.go


小修改一下剛剛的hello.go

package main

import (
 "fmt"
 "demo/newmath"
)

func main(){
 fmt.Printf("2 Sqrt is %v\n", newmath.Sqrt(2));
}



接著輸入
cd $GOPATH/src



輸入go install將hello安裝到lib
go install demo/hello





並執行hello,就可以看得到新的結果啦!
$GOPATH/bin/hello





Go語言在學習方便是有點像RubyPython等語言的易學性,等待後續的支持以及維護有可能會讓這個語言爆紅!

參考資料:
http://golang.org/doc/code.html
http://zh.wikipedia.org/wiki/Go
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

圖片參考:
http://www.tiobe.com/content/paperinfo/tpci/images/tpci_trends.png