GO语言method、interface、reflection、select

简介:

方法method

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

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

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

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

-不存在方法重载

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

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

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

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

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

##method:

package main
import "fmt"
type A struct {
    Name string
}
type B struct {
    Name string
}
func main() {
    a := A{}
    a.Printa()
}
func (a A) Printa() {
    fmt.Println("A")
}


接口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 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/1963461

相关文章
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
228 1
|
4月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
317 1
|
4月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
409 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
272 0
|
4月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
252 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
348 0
|
4月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
4月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
4月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
5月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。