Hello world程序
package main
import "fmt"
func main() {
var a string = "abc"
const WIDTH int = 5
fmt.Println("Hello, World!")
}
運行g(shù)o程序
go run hello.go
go build hello.go
./hello
Go 語言最主要的特性:
自動垃圾回收
更豐富的內(nèi)置類型
函數(shù)多返回值
錯誤處理
匿名函數(shù)和閉包
類型和接口
并發(fā)編程
反射
語言交互性
條件語句
if 布爾表達式 {
/* 在布爾表達式為 true 時執(zhí)行 */
} else if {
/* 在布爾表達式為 false 時執(zhí)行 */
} else {
/* 在布爾表達式為 false 時執(zhí)行 */
}
條件選擇
switch {
case false:
fmt.Println("1如贷、case 條件語句為 false")
fallthrough
case true:
fmt.Println("2、case 條件語句為 true")
fallthrough
case false:
fmt.Println("3、case 條件語句為 false")
fallthrough
case true:
fmt.Println("4篮洁、case 條件語句為 true")
case false:
fmt.Println("5、case 條件語句為 false")
fallthrough
default:
fmt.Println("6眠寿、默認 case")
}
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定義任意數(shù)量的 case */
default : /* 可選 */
statement(s);
}
循環(huán)語句
for init; condition; post { }
for condition { }
for { }
for key, value := range oldMap {
newMap[key] = value
}
例如:
numbers := [6]int{1, 2, 3, 5}
for i,x:= range numbers {
fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
}
函數(shù)(帶錯誤處理)
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
}
// 實現(xiàn)
}
數(shù)組
var variable_name [SIZE] variable_type
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
切片(動態(tài)數(shù)組)
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
func main() {
var numbers = make([]int,3,5)
/* 允許追加空切片 */
numbers = append(numbers, 0)
printSlice(numbers)
/* 向切片添加一個元素 */
numbers = append(numbers, 1)
printSlice(numbers)
/* 同時添加多個元素 */
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* 創(chuàng)建切片 numbers1 是之前切片的兩倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷貝 numbers 的內(nèi)容到 numbers1 */
copy(numbers1,numbers)
}
range 關鍵字用于 for 循環(huán)中迭代數(shù)組(array)佛舱、切片(slice)、通道(channel)或集合(map)的元素乌昔。
在數(shù)組和切片中它返回元素的索引和索引對應的值,在集合中返回 key-value 對壤追。
//這是我們使用range去求一個slice的和磕道。使用數(shù)組跟這個很類似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
//在數(shù)組上使用range將傳入index和值兩個變量。上面那個例子我們不需要使用該元素的序號行冰,所以我們使用空白符"_"省略了溺蕉。有時侯我們確實需要知道它的索引伶丐。
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
//range也可以用在map的鍵值對上。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
//range也可以用來枚舉Unicode字符串疯特。第一個參數(shù)是字符的索引哗魂,第二個是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
Map
一種無序的鍵值對的集合漓雅,是使用 hash 表來實現(xiàn)录别。
map_variable := make(map[key_data_type]value_data_type)
package main
import "fmt"
func main() {
/* 創(chuàng)建map */
countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
fmt.Println("原始地圖")
/* 打印地圖 */
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [ country ])
}
/*刪除元素*/ delete(countryCapitalMap, "France")
fmt.Println("法國條目被刪除")
fmt.Println("刪除元素后地圖")
/*打印地圖*/
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [ country ])
}
}
類型轉(zhuǎn)換
type_name(expression)
go開啟新線程
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
通道
ch := make(chan int)
ch <- v // 把 v 發(fā)送到通道 ch
v := <-ch // 從 ch 接收數(shù)據(jù)
// 并把值賦給 v