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 转载请注明,谢谢!
文章地址: https://www.wuyuans.com/blog/detail/123