//今天第一次看Golang,做爲初學者總結一下
年輕,它的誕生必然有他的意義,根據你們對他的介紹,總結下來以下:
Go 語言對於高性能分佈式系統領域而言,無疑比大多數其它語言有着更高的開發效率,Go語言具備很強的表達能力,它簡潔、清晰而高效。得益於其併發機制,用它編寫的程序可以很是有效地利用多核與聯網的計算機,其新穎的類型系統則使程序結構變得靈活而模塊化。 Go代碼編譯成機器碼不只很是迅速,還具備方便的垃圾回收機制和強大的運行時反射機制。它是一個快速的、靜態類型的編譯型語言。
以上是對他的介紹,那麼我就感興趣了,我打算研究一番,學習學習api
//今天簡單瞭解了基礎語法
package main import "fmt" func main() { fmt.Println("hello") }
能夠看到數組
\n
。Go並不像C那樣每條語句以;
結尾,在go的世界裏,一行表明一條語句結束。固然,若是要將多個語句寫在同一行,那麼則必需要以;
分隔。剩下的交給編譯器完成併發
單行註釋以//
開頭便可,多行註釋用/* ... */
包裹app
標識符第一個字符必須是字母或下劃線。不可用關鍵字iphone
int
和浮點型float32
、float64
,定義時無需指定,編譯器識別。由字母、數字、下劃線組成,不能以數字開頭。
聲明通常使用var
關鍵字。分佈式
指定變量類型,聲明後若不賦值,使用默認值。ide
var v_name v_type v_name = value
var v_name = value
。var
, 注意 :=
左側的變量不該該是已經聲明過的,不然會致使編譯錯誤。var vname1, vname2, vname3 = v1, v2, v3 vname1, vname2, vname3 := v1, v2, v3
const identifier [type] = value
+ - * / % ++ --
== != > < >= <=
&& || !
& | ^ << >>
= += -= *= /= %= <<= >>= &= |= ^=
& //&a 返回變量a的地址 * //*a 是一個指針變量
除了if else switch
外還有select
,以後單獨研究select
模塊化
for a := 0; a < 10; a++ { fmt.Printf("a 的值爲: %d\n", a) } //像while同樣 var a, b int = 1, 3 for a < b { a++ fmt.Printf("a 的值爲: %d\n", a) } //也能這麼用...有意思 numbers := [6]int{1, 2, 3, 5} for i, x := range numbers { fmt.Printf("第 %d 位 x 的值 = %d\n", i, x) } //還有goto
//明天接着看
2018.1.29 接着熟悉語法函數
Go 語言最少有個 main()
函數。性能
func fname( [params list] ) [return_types] { //函數體 }
好比:
func max(num1 int, num2 int) int { if num1 > num2 { return num1 } return num2 } // num1和num2都是int類型 func max(num1, num2 int) int { if num1 > num2 { return num1 } return num2 } // 返回多個值 func test(num1, num2 int) (int, int) { return num2, num1 } //需注意參數值傳遞和引用傳遞,可傳遞指針 func test(x int, y int) { var tmp = x x = y y = tmp } //可傳遞指針 func test(x *int, y *int) { var tmp = *x *x = *y *y = tmp }
pointer
類型爲nilvar v_name [SIZE] v_type var balance [10] int
//初始化數組中 {} 中的元素個數不能大於 [] 中的數字 var nums = [5]int{1, 2, 3, 4, 5} //若是忽略 [] 中的數字不設置數組大小,Go 語言會根據元素的個數來設置數組的大小 var nums = [...]int{1, 2, 3} //exp func main() { var nums = [3]int{1, 2, 3} fmt.Println(nums) var y [10]int for i := 0; i < 10; i++ { y[i] = i + 1 } fmt.Println(y) }
Go 語言的取地址符是 &
var x = 3 fmt.Println(&x) //0xc4200160b8 //聲明指針 var x *int //在指針類型前面加上 * 號(前綴)來獲取指針所指向的內容 var x = 3 var pt = &x //0xc4200160b8 fmt.Println(*pt) //3
var x *int //nil
2018.2.1繼續
例如:
type Books struct { id int title string author string subject string }
若是要訪問結構體成員,須要使用點號 (.) 操做符,格式爲:"結構體.成員名"
var book1 Books book1.id = 1 book1.author = "go" printStructAttr(book1) func printStructAttr(book Books) { fmt.Println(book.author) } //指針 var struct_pointer *Books var book1Pt *Books book1Pt = &book1 fmt.Println(book1Pt.author)
數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片("動態數組"),與數組相比切片的長度是不固定的,能夠追加元素,在追加時可能使切片的容量增大。
var identifier []type //切片不須要說明長度
var slice []int slice = append(slice, 3) slice = append(slice, 3, 5, 6) fmt.Println(slice) //Exp. var arr = [3]int{1, 2, 3} s := arr[:] fmt.Println(s) //[1 2 3] s = append(s, 5) fmt.Println(s) //[1 2 3 5] t := s[1:3] fmt.Println(t) //[2 3] //使用make()函數來建立切片 var slice1 []type = make([]type, len, capacity) //len() cap() var numbers = make([]int, 3, 7) fmt.Println(numbers) //[0 0 0] fmt.Println(len(numbers)) //3 fmt.Println(cap(numbers)) //7 //下面這個頗有意思 numbers = append(numbers, 6, 7, 8, 9, 10) fmt.Println(numbers) //[0 0 0 6 7 8 9 10] fmt.Println(len(numbers)) //8 fmt.Println(cap(numbers)) //14 有待研究
一種無序的鍵值對的集合。Map 最重要的一點是經過 key 來快速檢索數據,key 相似於索引,指向數據的值。咱們能夠像迭代數組和切片那樣迭代它。不過,Map 是無序的,咱們沒法決定它的返回順序,這是由於 Map 是使用 hash 表來實現的。
//聲明 var map_name map[key_type]val_type //默認 map 是 nil //使用make()初始化 map_name = make(map[string]string) //直接使用make() map_name := make(map[string]string) //賦值 var countryCapitalMap map[string]string countryCapitalMap = make(map[string]string) countryCapitalMap["France"] = "Paris" captial, ok := countryCapitalMap["France"] fmt.Println(captial) fmt.Println(ok) //遍歷 for country := range countryCapitalMap { fmt.Println("Capital of", country, "is", countryCapitalMap[country]) } //delete() delete(countryCapitalMap, "France")
把全部的具備共性的方法定義在一塊兒,任何其餘類型只要實現了這些方法就是實現了這個接口。
type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type] ... method_namen [return_type] } type struct_name struct { /* variables */ } func (struct_name_variable struct_name) method_name1() [return_type] { /* 方法實現 */ }
Exp. type Phone interface { call(int) string } type IPhone struct { } func (iPhone IPhone) call(nums int) string { fmt.Println("iphone call", nums) return "iphone" } func main() { var phone Phone phone = new(IPhone) var phoneName = phone.call(123) fmt.Println(phoneName) }