转载

快学Go

简介

  • Go 是Google开发的一种静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言

类型

  • 常用类型 bool byte(uint8) string int(类型多, 就不一一列出了) float(float32, float64) complex(complex64, complex128)

  • var 语句定义了一个变量的列表

// 变量定义语法: var var_name type varandrewstring varliustring="andrewliu"  // 段声明语法只能用在函数内 k :=3 // 表达式 T(v) 将值 v 转换为类型 T, Go不支持隐式转换! 必须显示转换类型 varffloat32=3.2222 varzuint=uint(f) // 定义一个常量 constWorld ="世界" 

控制流

if语句

  • if语言的condition不需要小括号
  • if语句的左大括号不能另起一行
  • 可以在if语句中定义局部变量, 生命周期在if-else内
// if语句后没有小括号, 但是逻辑题要使用{} ifv := math.Pow(x, n); v < lim { returnv // v的生命周期在if-else语句内部  } else{  fmt.Printf("%g>=%g/n", v, lim)  } 

switch语句

  • switch语句不需要显式的使用 break , 满足条件后会自动终止
funcmain(){ t := time.Now()  switch { // switch后可以没有语句, 类似于if-else if- else  case t.Hour() <12:  fmt.Println("Good morning!") //满足条件后会自动退出  case t.Hour() <17:  fmt.Println("Good afternoon.")  default:  fmt.Println("Good evening.")  } } 

循环

// 类似于c语言, 只是没有小括号, 循环体使用{} import "fmt"  func main() { sum:=0 fori :=0; i <10; i++ { sum+= i  }  fmt.Println(sum) }  // c语言中的while语句, 在Go依然为for关键字 forsum<1000{ sum+=sum  }  // while(true)语句 for{  fmt.Println("andrewliu") } 

值得一提的是 range , 类似迭代器操作, 返回 (索引, 值)(键, 值)

// range操作类似于python中的enumerate varpow = []int{1,2,4,8,16,32,64,128} funcmain() { fori, v :=rangepow {  fmt.Printf("2**%d = %d/n", i, v)  } } 

指针

Go竟然有指针, 我简直惊呆了

  • 不支持指针运算, 不支持 -> 运算符, 直接 . 访问成员
i, j := 42,2701 p := &i // p指针指向变量i fmt.Println(*p)// p解引用操作, 读取内存地址上的值 *p = 21// 通过指针来设置i的值 fmt.Println(i) 

数据结构

结构体

  • 使用 type 定义新的结构体
  • 值类型, 赋值和传参会复制全部内容
typeVertexstruct{  X float64  Y float64 } // Go没有类, 但可以通过结构体定义方法, 方法接收者 出现在 func 关键字和方法名之间的参数中 func(v *Vertex) Abs()float64{ returnmath.Sqrt(v.X * v.X + v.Y * v.Y) } funcmain() {  fmt.Println(Vertex{1,2}) } 

数组

  • 数组是值类型, 赋值和传参会复制整个数据
  • 支持多维数组
  • slice 并不是数组或数组指针, slice通过内部指针和相关属性引用数组片段, 从来实现变长数组
// 定义一个长度为10的定长数组 vara[10]int // slice, 支持切片操作 s := []int{2,3,5,7,11,13} // 使用make函数构造一个slice a := make([]int,5)  // 第一个参数为slice, 其余的元素被添加到slice尾部, 最终返回新slice对象 funcappend(s []T, vs ...T) []T 

map

  • 引用类型, 哈希表
  • 键必须是支持相等运算符 (==、!=) 类型, 如 number、string、 pointer、array、struct,以及对应的 interface
  • 不保证key的顺序性
varmmap[string]Vertex // map需要通过make创建, []中为key的类型, 后面为value的类型 m = make(map[string]Vertex)  varm =map[string]Vertex{ "Bell Labs": Vertex{  40.68433,-74.39967,  }, "Google": Vertex{  37.42202,-122.08408,  }, } 

函数

  • 支持不定长变参, 不支持默认参数
  • 可以有多个返回值
  • 函数可以作为参数传递
// 函数定义 funcadd(xint, yint)int{ returnx + y// 可以有多个返回值 } 
packagemain // 通过()一次导入多个包 import( "fmt" "time" ) funccompute(fnfunc(float64,float64)float64)float64{ returnfn(3,4) } funcmain() {  fmt.Println("The time is", time.Now())  fmt.Println(" My name is Liubin") } 

函数作为参数

typeFormatFuncfunc(sstring, x, yint)string// 定义函数类型。 funcformat(fn FormatFunc, sstring, x, yint)string{ returnfn(s, x, y) } 

可变参数

functest(sstring, n ...int)string{ varxint for_, i :=rangen {  x += i  } returnfmt.Sprintf(s, x) } 

error

error 是一个 build-in 的接口

typeerror interface{ Error()string } 

参考链接

  • Go学习笔记
  • Learn Go in Y minutes
  • A tour of the Go
原文  http://andrewliu.in/2016/03/27/快学Go/
正文到此结束
Loading...