GO语言method、interface、reflection、select

方法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函数

-可设置超时

时间: 2024-10-20 05:34:00

GO语言method、interface、reflection、select的相关文章

浅析Go语言的Interface机制

前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语言的interface是我比较喜欢的特性之一.interface与struct之间可以相互转换,struct不需要像JAVA在源码中显示说明实现了某个接口,可以通过约定的形式,隐式的转换到interface,还可以在运行时查询接口类型,这样有种用动态语言写代码的感觉,但是又可以在编译时进行检查,捕捉

Go语言入门——interface

1.Go如何定义interface Go通过type声明一个接口,形如 type geometry interface { area() float64 perim() float64 } 和声明一个结构体一样,接口也是通过type声明. type后面是接口名称,紧挨着是关键字interface. 接口里面定义的area()和perim是接口geometry的方法. 有了接口,那应该如何实现接口呢? type rect struct { width, height float64 } func

浅解 go 语言的 interface(许的博客)

我写了一个 go interface 相关的代码转换为 C 代码的样例.也许有助于大家理解 go 的 interface.不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节. Go 代码: package main import "fmt" // ------------------------------------------------------------- type IReadWriter interface {     Read(buf *byt

GO语言练习:channel select 超时机制

1.代码 2.运行 3.解析 1.代码 1 package main 2 3 import ( 4 "time" 5 "fmt" 6 ) 7 8 func waitFor(ch chan int) { 9 fmt.Println(time.Now(), "writing ...") 10 time.Sleep(1e9) 11 ch <- 10 12 fmt.Println(time.Now(), "wrote ...")

Go语言之interface

interface 理论 接口是一个或多个方法签名的集合 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为Structural Typing 接口只有方法声明,没有实现,没有数据字段 接口可以匿名嵌入其他接口,或嵌入到结构中 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态,也无法获取指针 只有当接口存储的类型和对象都为nil时,接口才等于nil 接口调用不会做receiver的自动转换 接口同样支持匿名字段方

SQL_数据操作语言SELECT

概述 本节简单介绍T-SQL基本数据操作语言(DML),主要包括 SELECT INSERT UPDATE DELETE SELECT语句 主语是MS SQL Server ,而动词SELECT是整条语句的谓语部分,用于告诉SQL Server要完成什么样子的操作,SELECT表示从数据库中读取数据,记住仅仅是读取,所选择的内容由SELECT后面的表达式/列表确定 FROM子语句用于指定要读取数据的来源,通常是一个表或几个表的名称.请看下面的示例: SELECT Name FROM Produc

Java语言进阶过程(转)

[以下肯定是不完整的列表,欢迎补充] Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了. 但有一些一般的步骤: 1. 熟悉一种文本编辑器,比如Vim, Emacs, Notepad++, TextMate等.知道哪些是开源的,哪些是闭源的,哪些要收费.养成不用盗版软件的习惯. 2. 安装JDK(建议用你的Linux发行版自带的软件包管理器安装openjdk,过程中可能需要读发行版特定的文档) 3. 写一个Java的Hello world程序,并用命令行工具javac编译

10. Go 语言反射

Go 语言反射 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息. 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称.类型信息.结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们. Go程序在运行期使用reflect包访问程序的反射信息. 其它语言中的反射 C/C++ 语言没有支持反射功能,只能通过 ty

初探go-golang语言初体验

2017/2/24 一.初体验 1.环境 wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz cat <<'_EOF' >>/etc/profile #golang export PATH=$PATH:/usr/local/go/bin export GOPATH=/opt/go _EOF source