這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go語言基礎概念
2014年2月17日 go語言學習
個人論述:關於程式語言,每個程式員都有不同的看法和觀點,有人覺得C++語言好用,夠快;有人覺得C語言好用夠強大,又有人覺得Java好用,夠簡潔。目前程式設計語言數不勝數了,目前排在前面的還是C、C++、Java,這三種語言使用人數最多的,曆史也是最悠久的。它們都是經過無數程式員千錘百鍊而慢慢成熟起來的,現在很難評判說到底哪個語言好用或者開發出來的程式功能強大,討論這些是沒有意義的,一個語言到底能做什麼東西全靠程式員個人的功力和對語言的熟悉程度,它畢竟是一個工具,工具是我們開發程式的利器,只有萬般打磨才能變得鋒利無比。自然使用過很多種語言的大牛來說,自然有自己喜愛的語言,因為他可能更明白每一種語言的特性,哪一種能讓自己開發變得輕鬆自在。所以對於語言的評判,是沒有標準答案的,我每次看到程式員因為語言而吵起來我就覺得好笑,有這種閑心不如多提升自己的技術水平好過。對我而言,能開發出好的應用好的軟體的語言就是好語言,只有喜不喜歡,沒有好不好之說。
為了擴充自己的知識面呢,小巫也開始打算學習新的語言,畢竟技術這個東西,有時候怎麼死的都不知道,跟著潮流走可以降低自己的風險。Go語言呢,也有幾年的時間了,是Google推出的第二款開源語言,我稍微學了一下,發現它似乎不太符合我的口味,雖說它看起來很簡潔,把一些不必要的東西去除掉,但可讀性似乎差了點。因為還沒深入學,沒有體會到開發這門語言的大神的用意,所以先放下自己的偏見,試著把這門語言入門一些。
最簡單Go語言程式
package mainimport "fmt"func main() {fmt.Println("Hello, 世界")}
接下來我會逐一介紹Go語言的基礎概念,如下
1. 包是什嗎?
2. 匯入和匯出
3. 函數
4. 傳回值
5. 變數的聲明
6. Go語言基礎資料型別 (Elementary Data Type)
7. 常量的定義
這裡推薦一個線上編程學習的網站吧(FenBy),關於Go語言的摘錄我是從這個網站裡學習的。
http://www.fenby.com/course/units/1015#top
1、包概念
- 每個 Go 程式都是由包組成的。
- 程式啟動並執行入口是包 `main`。
- 這個程式使用並匯入了包 "fmt" 和 `"math"`。
- 按照慣例,包名與匯入路徑的最後一個目錄一致。
小巫註:
- Go語言匯入包的方式跟Java是類似的,關鍵字也是import,不過有很大差別的是,它匯入的類庫不用進行分隔,只是用雙引號括起來代表一個類庫。
- 包名“main”是程式入口,這個跟Java似乎不一樣,Java可以分為很多個包,用於避免同名衝突的情況。然而Go語言似乎就只有一個main?
2. 匯入和匯出
1、怎麼匯入
這個代碼用圓括弧組合了匯入,這是“factored”匯入語句。同樣可以編寫多個匯入語句,例如:
import "fmt"
import "math"
2、匯出
在匯入了一個包之後,就可以用其匯出的名稱來調用它。在 Go 中,首字母大寫的名稱是被匯出的。
Foo
和 FOO
都是被匯出的名稱。名稱 foo
是不會被匯出的。執行代碼。然後將 math.pi
改名為 math.Pi
再試著執行一下。
package mainimport ( "fmt" "math")func main() { fmt.Println(math.pi)}
3. 函數
1、函數用法(1)
函數可以沒有參數或接受多個參數。
在這個例子中,"add" 接受兩個 int 類型的參數。
注意類型在變數名 _之後_。
package mainimport "fmt"func add(x int, y int) int { return x + y}func main() { fmt.Println(add(42, 13))}
2、函數用法(2)
當兩個或多個連續的函數具名引數是同一類型,則除了最後一個類型之外,其他都可以省略。
在這個例子中 ,
x int, y int
被縮寫為
x, y int
package mainimport "fmt"func add(x, y int) int { return x + y}func main() { fmt.Println(add(42, 13))}
3、new 函數
運算式 new(T) 分配了一個零初始化的 T 值,並返回指向它的指標。
var t *T = new(T)
或
t := new(T)
package mainimport "fmt"type Vertex struct { X, Y int}func main() { v := new(Vertex) fmt.Println(v) v.X, v.Y = 11, 9 fmt.Println(v)}
4、函數為值
函數也是值。Function values
package mainimport ( "fmt" "math")func main() { hypot := func(x, y float64) float64 { return math.Sqrt(x*x + y*y) } fmt.Println(hypot(3, 4))}
5、函數的閉包
並且函數是完全閉包的。
函數 adder 返回一個閉包。每個閉包被綁定到了特定的 sum 變數上。
package mainimport "fmt"func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum }}func main() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println( pos(i), neg(-2*i), ) }}
6、練習:費伯納西閉包
現在來通過函數做些有趣的事情。
實現一個 fibonacci
函數,返回一個函數(一個閉包)可以返回連續的費伯納西數。
package mainimport "fmt"// fibonacci 函數會返回一個返回 int 的函數。func fibonacci() func() int { var count,sum1,sum2 int = 0,1,1 return func() int { switch count { // 0和1,fib =1 case 0,1: count++; default: sum1,sum2 = sum2, sum1+sum2 } return sum2 }}func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) }}
4.傳回值 (1/2)
1、多傳回值
函數可以返回任意數量的傳回值。
這個函數返回了兩個字串。
package mainimport "fmt"func swap(x, y string) (string, string) { return y, x}func main() { a, b := swap("hello", "world") fmt.Println(a, b)}
2、命名傳回值
函數接受參數。在 Go 中,函數可以返回多個“結果參數”,而不僅僅是一個值。它們可以像變數那樣命名和使用。
如果命名了傳回值參數,一個沒有參數的 return
語句,會將當前的值作為傳回值返回。
package mainimport "fmt"func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x return}func main() { fmt.Println(split(17))}
5. 變數的聲明 (1/3)
1、變數
var
語句定義了一個變數的列表;跟函數的參數列表一樣,類型在後面。
package mainimport "fmt"var x, y, z intvar c, python, java boolfunc main() { fmt.Println(x, y, z, c, python, java)}
2、初始設定變數
變數定義可以包含初始值,每個變數對應一個。
如果初始化是使用運算式,則可以省略類型;變數從初始值中獲得類型。
package mainimport "fmt"var x, y, z int = 1, 2, 3var c, python, java = true, false, "no!"func main() { fmt.Println(x, y, z, c, python, java)}
3、短聲明變數
在函數中,`:=` 簡潔指派陳述式在明確類型的地方,可以用於替代 var
定義。
(`:=` 結構不能使用在函數外,函數外的每個文法塊都必須以關鍵字開始。)
package mainimport "fmt"func main() { var x, y, z int = 1, 2, 3 c, python, java := true, false, "no!" fmt.Println(x, y, z, c, python, java)}
6.基本資料有哪些 (1/1)
1、基本類型
Go 的基本類型有Basic types
boolstring
int int8 int16 int32 int64uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的別名
rune // int32 的別名// 代表一個Unicode碼
float32 float64
complex64 complex128
7.常量的定義 (1/2)
1、常量
常量的定義與變數類似,只不過使用 const
關鍵字。
常量可以是字元、字串、布爾或數字類型的值。
package mainimport "fmt"const Pi = 3.14func main() { const World = "世界" fmt.Println("Hello", World) fmt.Println("Happy", Pi, "Day") const Truth = true fmt.Println("Go rules?", Truth)}
2、數值常量
數值常量是高精度的 _值_。
一個未指定類型的常量由上下文來決定其類型。
也嘗試一下輸出 needInt(Big) 吧。
package mainimport "fmt"const ( Big = 1 << 100 Small = Big >> 99)func needInt(x int) int { return x*10 + 1 }func needFloat(x float64) float64 { return x * 0.1}func main() { fmt.Println(needInt(Small)) fmt.Println(needFloat(Small)) fmt.Println(needFloat(Big))}