Golang笔记

2015年10月07日 分类:学习笔记

好久没更新了。。。

最近学了点Golang,先简单记一下,以后慢慢完善。

1. 类型

Golang的基本类型有如下几种,除了complex需要import,其他都可以直接使用。

bool

string

int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr

byte // uint8 的别名

rune // int32 的别名
     // 代表一个Unicode码

float32 float64

complex64 complex128 // import "math/cmplx"

变量没有赋值时,数值类型为0,布尔类型为false,字符串为”“。

1.1 变量

可以定义变量列表,类型跟在最后面,并且初始化。

var i, j int = 1, 2
var (
 i int = 1
 j int = 2
)

函数内可以使用:=定义明确类型的变量。

func main() {
 i, j := 1, 2
}

1.2 常量

常量的定义和变量类似,不能用:=定义

const Pi = 3.14
const (
 Big = 1 << 100
 Small = Big >> 99
)

1.3 指针

指针和c语言的一样,但是*没有指针运算*。

i := 1
p := &i
*p = 2
fmt.Println(i, *p)

1.4 结构体

type Vertex struct {
 X int
 Y int
}
v := Vertex{1, 2}
v.X = 2
Vertex{X:1}

1.5 数组和slice

//数组
var a [2]string

// slice
s := []int{2, 3, 5, 7, 11, 13}
ss := s[1:4]

// 构造空分片
a := make([]int, 0, 5) // len(b)=0, cap(b)=5

slice的零值是nil,一个nil的slice的长度和容量是0。

1.6 map

map必须用make创建,零值为nil,不能赋值。

m := make(map[string]int)
m["first"] = 1
m["two"] = 2
delete(m, "first")
elem, ok := m["first"]

2. 控制语句

2.1 for

sum := 0
for i := 0; i < 10; i++ {
    sum += i
}

for sum < 1000 {
    sum += sum
}

// 死循环
for {
    sum += sum
}

arr := []int
for i,v := range arr {
    fmt.Println(i,v)
}

2.2 if

if a > 0{
}

if a:=1; a > 0{
}else{
}

2.3 switch

switch i {
case 0:
    fmt.Println("zero")
case 1:
    fmt.Println("one")
default:
    fmt.Println("none")
}

switch i := 1; i {
}

switch {
case t.Hour() < 12:
    fmt.Println("Good morning!")
case t.Hour() < 17:
    fmt.Println("Good afternoon.")
default:
    fmt.Println("Good evening.")
}

2.4 defer

defer将函数压入栈中,当执行完毕时*后进先出*顺序执行,通常用来close资源。

func main() {
 defer fmt.Println("wuyuans.com")

 fmt.Println("hello")
}

3. 函数

函数的返回值在最后面,可以有多个值返回。

func add(x int, y int) int {
 return x + y
}
func swap(x, y string) (string, string) {
 return y, x
}
func add(x int, y int) s int {
 s = x + y
 return
}

4. 方法

Golang可以在包中对结构体或者类型定义方法,来实现类的功能。

type Vertex struct {
 X, Y float64
}
func (v Vertex) Abs() float64 {
 return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v *Vertex) SetX(x float64){
    v.X = x
}

5. 接口

接口类型是由一组方法定义的集合。接口类型的值可以存放实现这些方法的任何值。

type Abser interface {
 Abs() float64
}
var a Abser
v := &Vertex{}
a = v

6. goroutine

goroutine 是由Go运行时环境管理的轻量级线程,使用go关键字启动。

go func(){
    fmt.Println("hello wuyuans.com")
}()

6.1 channel

channel类似mq,主要用于线程间传递数据。

c := make(chan int)
c <- 1
out := <-c
out, ok := <-c // ok 标记管道关闭
close(c)

// 带缓冲
ch := make(chan int, 100)

6.2 select

select 语句使得一个 goroutine 在多个通讯操作上等待,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支。当多个都准备好的时候,会随机选择一个。

select {
case x := <-c:
    fmt.Println(x)
case <-quit:
    fmt.Println("quit")
    return
default:
    time.Sleep(50 * time.Millisecond)
}
作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: http://wuyuans.com/2015/10/golang-note