码迷,mamicode.com
首页 > 编程语言 > 详细

GO语言method、interface、reflection、select

时间:2017-09-07 22:55:03      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:语言   go   method   

方法method

-GO方法虽没有class,依旧有method

-通过显示说明receiver来实现与某个类型的组合

-只能为同一个包中的类型定义方法

-RECEIVER可以是类型的值或指针

-不存在方法重载

-可以使用值或指针来调用方法,编译器会自动完成转换

-从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数

-如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法

-类型别名不会拥有底层类型所附带的方法

-方法可以调用结构中的非公开字段

接口interface

-接口是一个或多个方法签名的集合


反射reflection



并发concurrency

Channel

-Channel是goroutine沟通的桥梁,大都是阻塞同步的

-通过make创建,close关闭

-Channel是引用类型

package main

import "fmt"

import "time"

func main(){

c :=make(chan bool)

go func(){

fmt.Println("GO GO GO")

c <-true

}()

<-c

time.Sleep(2*time.Second)


}


-可以使用for range 来迭代不断操作channel

package main

import "fmt"

//import "time"

func main(){

c :=make(chan bool)

go func(){

fmt.Println("GO GO GO")

c <-true

close(c)

}()

for v :=range c{

fmt.Println(v)

}


}


-可以设置单项或双向通道

-可以设置缓存大小,在未被填满前不会发生阻塞

package main

import "fmt"

import "runtime"

func main(){

runtime.GOMAXPROCS(runtime.NumCPU())

c :=make(chan bool,10)

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

go Go(c,i)

}

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

<-c

}

}

func Go(c chan bool,index int){

a :=1

for i :=0;i<100000000;i++{

a+=1

}

fmt.Println(index,a)

c<-true


}

等价///

package main

import "fmt"

import "runtime"

import "sync"

func main(){

runtime.GOMAXPROCS(runtime.NumCPU())

wg :=sync.WaitGroup{}

wg.Add(10)

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

go Go(&wg,i)

}

wg.Wait()

}

func Go(wg *sync.WaitGroup,index int){

a :=1

for i :=0;i<100000000;i++{

a+=1

}

fmt.Println(index,a)

wg.Done()


}


Select

-可处理一个或多个channel的发送与接收

-同时有多个可用的channel时按随机顺序处理

-可用空的select来阻塞main函数

-可设置超时


本文出自 “DBAspace” 博客,请务必保留此出处http://dbaspace.blog.51cto.com/6873717/1963461

GO语言method、interface、reflection、select

标签:语言   go   method   

原文地址:http://dbaspace.blog.51cto.com/6873717/1963461

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!