go语言之进阶篇有缓冲channel】的更多相关文章

1.有缓冲channel 示例:  有缓存会阻塞,当读取完其中数值时,又可以写入. package main import ( "fmt" "time" ) func main() { //创建一个有缓存的channel ch := make(chan int, 3) //len(ch)缓冲区剩余数据个数, cap(ch)缓冲区大小 fmt.Printf("len(ch) = %d, cap(ch)= %d\n", len(ch), cap(ch…
1.无缓冲channel 示例: package main import ( "fmt" "time" ) func main() { //创建一个无缓存的channel ch := make(chan int, 0) //len(ch)缓冲区剩余数据个数, cap(ch)缓冲区大小 fmt.Printf("len(ch) = %d, cap(ch)= %d\n", len(ch), cap(ch)) //新建协程 go func() { for…
1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Personer interface { //超集 Humaner //匿名字段,继承了sayhi() sing(lrc string) } type Student struct { name string id int } //Student实现了sayhi() func (tmp *Student) sayhi…
1.channel介绍 和map类似,channel也一个对应make创建的底层数据结构的引用. 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者何被调用者将引用同一个channel对象.和其它的引用类型一样,channel的零值也是nil. 定义一个channel时,也需要定义发送到channel的值的类型.channel可以使用内置的make()函数来创建: make(chan Type) //等价于make(chan Type, 0) ma…
1.单向channel的应用 示例: package main import ( "fmt" ) //此通道只能写,不能读 func producer(out chan<- int) { for i := 0; i < 10; i++ { out <- i * i } close(out) } //此channel只能读,不能写 func consumer(in <-chan int) { for num := range in { fmt.Println(&q…
1.单向channel特点 package main //"fmt" func main() { //创建一个channel, 双向的 ch := make(chan int) //双向channel能隐式转换为单向channel var writeCh chan<- int = ch //只能写,不能读 var readCh <-chan int = ch //只能读,不能写 writeCh <- 666 //写 //<-writeCh //err, inva…
1.通过range遍历channel内容 package main import ( "fmt" ) func main() { ch := make(chan int) //创建一个无缓存channel //新建一个goroutine go func() { for i := 0; i < 5; i++ { ch <- i //往通道写数据 } //不需要再写数据时,关闭channel close(ch) //ch <- 666 //关闭channel后无法再发送数…
1.关闭channel package main import ( "fmt" ) func main() { ch := make(chan int) //创建一个无缓存channel //新建一个goroutine go func() { for i := 0; i < 5; i++ { ch <- i //往通道写数据 } //不需要再写数据时,关闭channel close(ch) //ch <- 666 //关闭channel后无法再发送数据 }() //别…
一.select作用 Go里面提供了一个关键字select,通过select可以监听channel上的数据流动. select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述. 与switch语句可以选择任何可使用相等比较的条件相比, select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作,大致的结构如下: select { case <-chan1: // 如果chan1成功读到数据,则进行该case处理语句…
1.并发聊天服务器原理分析 2.并发聊天室 功能: 广播消息.广播上线. 查询在线用户.修改用户名.用户主动退出.超时处理 示例: package main import ( "fmt" "net" "strings" "time" ) type Client struct { C chan string //用户发送数据的管道 Name string //用户名 Addr string //网络地址 } //保存在线用户 c…
1.简单版并发服务器 示例1: package main import ( "fmt" "net" "strings" ) //处理用户请求 func HandleConn(conn net.Conn) { //函数调用完毕,自动关闭conn defer conn.Close() //获取客户端的网络地址信息 addr := conn.RemoteAddr().String() fmt.Println(addr, " conncet s…
Ticker是一个定时触发的计时器,它会以一个间隔(interval)往channel发送一个事件(当前时间),而channel的接收者可以以固定的时间间隔从channel中读取事件. 1.Ticker的使用 示例: Ticker 每沿时一秒输出一个结果 package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) i := 0 for { &…
1.Timer的使用 示例: #创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间) package main import ( "fmt" "time" ) //验证time.NewTimer(),时间到了,只会响应一次 func main() { timer := time.NewTimer(1 * time.Second) for { <-timer.C fmt.Println("时间到") } } func ma…
1.goroutine是什么 goroutine是Go并行设计的核心.goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享.执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩.也正因为如此,可同时运行成千上万个并发任务.goroutine比thread更易用.更高效.更轻便. 2.创建goroutine协程 只需在函数调⽤语句前添加 go 关键字,…
1.并行和并发的概念 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行. 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行. 2.并行和并发的区别 并发是两个队列交替使用一台咖啡机 并行是两个队列同时使用两台咖啡机 3.并发和并行原理图 图1 4.go语言并发优势 有人把Go比作21世纪的C语言,第一是因为Go语…
一.JSON处理 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaScript的一个子集,但JSON采用完全独立于编程语言的文本格式,且表现为键/值对集合的文本描述形式(类似一些编程语言中的字典结构),这使它成为较为理想的.跨平台.跨语言的数据交换语言. 开发者可以用 JSON 传输简单的字符串.数字.布尔值,也可以传输一个数组,或者一个更复杂的复合结构.在 Web 开…
正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具.虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活.按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合. Go语言通过regexp标准包为正则表达式提供了官方支持,如果你已经使用过其他编程语言提供的正则相关功能,那么你应该对Go语言版本的不会太陌生,但是它们之间也有一些小的差异,因为Go实现的是RE2标准,除了\C,详细的语法描述参考:http://code.google.com/p/re2/w…
1.面向对象编程 对于面向对象编程的支持Go 语言设计得非常简洁而优雅.因为, Go语言并没有沿袭传统面向对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继承).虚函数.构造函数和析构函数.隐藏的this指针等. 尽管Go语言中没有封装.继承.多态这些概念,但同样通过别的方式实现这些特性: 封装:通过方法实现 继承:通过匿名字段实现 多态:通过接口实现 2.匿名组合和匿名字段初始化 示例: package main import "fmt"…
1.windows安装redis 软件包下载地址: https://github.com/MicrosoftArchive/redis/releases 1.1.安装--->下一步--->到完成. 1.2.设置redis密码. C:\Program Files\Redis #编辑这个文件: redis.windows-service.conf 找到含有requirepass字样的地方,追加一行,输入requirepass 123456 备注 :做实验我们就不设置密码. 点击“开始”>右击…
一.mysql操作基本语法 1.创建名称nulige的数据库 CREATE DATABASE nulige DEFAULT CHARSET utf8 COLLATE utf8_general_ci; use nulige 2.建表,Id自增 create table user_info( nid int not null auto_increment primary key, username varchar(20), departname varchar(20), create_time ti…
一.Go连接mysql 1.mysql驱动 地址:https://github.com/Go-SQL-Driver/MySQL 说明: sql.Open()函数用来打开一个注册过的数据库驱动,Go-MySQL-Driver中注册了 mysql这个数据库驱动,第二个参数是DNS,它是Go-MySQL-Driver定义的一些数据库链接和配置信息. 2.下载mysql驱动包方法 在LiteIDE中,选中"github.com/go-sql-driver/mysql" 这行代码,再点编译---…
1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html   下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页面规律: <h1 class="dp-b"><a href="  一个段子url连接   “ 段子url: <h1>    标题  </h1>  只取1个 <div class="content-txt pt10"…
1.爬百度贴吧并发版 示例: package main import ( "fmt" "net/http" "os" "strconv" ) //爬取网页内容 func HttpGet(url string) (result string, err error) { resp, err1 := http.Get(url) if err1 != nil { err = err1 return } defer resp.Body.…
1.http客户端编程 示例: http_server.go package main import ( "fmt" "net/http" ) //w, 给客户端回复数据 //r, 读取客户端发送的数据 func HandConn(w http.ResponseWriter, r *http.Request) { fmt.Println("r.Method = ", r.Method) fmt.Println("r.URL = &quo…
1.http服务器获取客户端的一些信息 示例: package main import ( "fmt" "net/http" ) //w, 给客户端回复数据 //r, 读取客户端发送的数据 func HandConn(w http.ResponseWriter, r *http.Request) { fmt.Println("r.Method = ", r.Method) fmt.Println("r.URL = ", r.U…
1.响应报文测试方法 示例: package main import ( "fmt" "net/http" ) //服务端编写的业务逻辑处理程序 func myHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello world") } func main() { http.HandleFunc("/go", myHandler) //在指…
1.服务器如何知道用户需要什么资源 示例: package main import ( "fmt" "net" ) func main() { //监听 listener, err := net.Listen("tcp", ":8000") if err != nil { fmt.Println("Listen err = ", err) return } defer listener.Close() //…
1. 请求报文格式分析 示例: package main import ( "fmt" "net" ) func main() { //监听 listener, err := net.Listen("tcp", ":8000") if err != nil { fmt.Println("Listen err = ", err) return } defer listener.Close() //阻塞等待用户…
一.文件传输 1.文件传输原理 2.文件传输 示例: 发送方: send_file.go package main import ( "fmt" "io" "net" "os" ) //发送文件内容 func SendFile(path string, conn net.Conn) { //以只读方式打开文件 f, err := os.Open(path) if err != nil { fmt.Println("o…
1.获取文件属性 示例: get_file_attribute.go package main import ( "fmt" "os" ) func main() { list := os.Args if len(list) != 2 { fmt.Println("useage: xxx file") return } fileName := list[1] info, err := os.Stat(fileName) if err != nil…