天天看点

GO语言method、interface、reflection、select

方法method

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

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

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

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

-不存在方法重载

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

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

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

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

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

##method:

接口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

//import "time"

close(c)

for v :=range c{

fmt.Println(v)

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

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

import "runtime"

runtime.GOMAXPROCS(runtime.NumCPU())

c :=make(chan bool,10)

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

go Go(c,i)

func Go(c chan bool,index int){

a :=1

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

a+=1

fmt.Println(index,a)

c<-true

等价///

import "sync"

wg :=sync.WaitGroup{}

wg.Add(10)

go Go(&wg,i)

wg.Wait()

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

wg.Done()

Select

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

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

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

-可设置超时

本文转自 DBAspace 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/1963461