golang 笔记
golang 的坑
package main
import (
"fmt"
"net/http"
"time"
)
func Hello(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello!!\n"))
time.Sleep(10 * time.Second)
}
func main() {
http.HandleFunc("/hello", Hello)
addr := "0.0.0.0:8083"
if err := http.ListenAndServe(addr, nil); err != nil {
fmt.Println(err)
return
}
}
ResponseWriter.Write只是将数据写进了一个缓冲区,如过缓冲区未被写满是不会往tcp连接里写的,表现为包没发出去。http server会在Handler函数结束后调用Flush,所以在Handler函数里的任何阻塞行为都会影响到回包数据的发送。
有两种方法来规避:
主动调用Flush
w.(http.Flusher).Flush()
将长操作用go包起来
go func() { time.Sleep(10*time.Second) }()
go并行计算
func main() {
arr := [4]int{1, 2, 3, 4}
var wg sync.WaitGroup
for _, v := range arr {
wg.Add(1)
fmt.Println(v)
go func(i int) {
defer wg.Done()
fmt.Println(i)
}(v)
}
wg.Wait()
}
wg.Add()会+1,wg.Done()会-1, wg.Wait()一直阻塞到0;
go线程间通信
func main() {
ch := make(chan int, 2)
go func() {
for i := 0; i < 2; i++ {
ch <- i
}
}()
fmt.Println("print")
for j := 0; j < 2; j++ {
res, ok := <-ch
if ok {
fmt.Println(res)
}
}
}
通过go关键字可以开启一个协程执行此函数。通过channel通信。
ch是一个可读可写channel,有2个缓存,可连续写入2次。如果再写入就会堵塞,一直等到数据被消费。
go map 初始化
m := make(map[string]int)
m["a"] = 1
m["b"] = 2
m := map[string]interface{}{
"Name": "Wednesday",
"Age": 6,
"Parents": []interface{}{
"Gomez",
"Morticia",
},
}
go包依赖
https://infoq.cn/article/history-go-package-management
golang 笔记的更多相关文章
- golang笔记1
golang笔记1 go代码是用包来组织的,每个包有一个或多个go文件组成,这些go文件文件放在一个文件夹中 每个源文件开始都用一个package声明,指明本源文件属于哪个包 pakage声明后紧跟这 ...
- Golang笔记(二)面向对象的设计
Golang笔记(二)面向对象的设计 Golang本质还是面向过程的语言,但它实现了一些OOP的特性,包括抽象.封装.继承和多态. 抽象和封装 Golang和C语言一样以struct为数据结构核心,不 ...
- Golang笔记(一)简洁的语言风格
Golang笔记(一)简洁的语言风格 概述 Golang继承了很多C语言的风格,寡人使用了十几年C语言,切换到Golang时上手很快,并且随着深入的使用,越来越喜欢这门语言.Golang最直观的感受是 ...
- Golang笔记集
学习Golang了, 下面分享我的, 还有我收集的Golang的学习资料 我的基础笔记地址: https://github.com/zhuchangwu/go-study-notes 其他参考: Go ...
- Golang笔记整理--One day
题外话: 很早就有整理学习笔记的想法,今天将想法付诸于行动,将Golang相关知识系统整理一遍,此分类为Golang学习笔记,最近开始学习这门语言的同学可以参考. 一 第一个Go程序: hello.g ...
- golang笔记——函数与方法
如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...
- golang笔记——IDE
可选方案有 Lite IDE\GoSublime\Visual Studio Code\Goclipse\Vim 1.Lite IDE 这是国人开发的开源且跨平台的 golang 专属IDE,也算是目 ...
- golang笔记——包
1.包简述 GO本身没有项目的概念,只有包,包括可执行包和不可执行包,而不管什么包,都应该包含在 $GOPATH/src 目录下,GO命令和编译器会在 $GOPATH/src 目录下搜索相应的包.比如 ...
- golang笔记——环境搭建
1.下载安装 从 https://golang.org/dl/ 这里下载最新版本的 golang 安装包,分别有 Windows\Linux\Apple OSX\源码包. golang的官方网站是 h ...
- 【Golang笔记】Golang工具包Cobra安装记录
0.环境信息 系统:Win10_x64 Go版本:go version go1.8.1 windows/amd64 Git版本:git version 2.17.0.windows.1 1.安装Go运 ...
随机推荐
- Android学习笔记之SoftReference软引用,弱引用WeakReference
SoftReference可以用于bitmap缓存 WeakReference 可以用于handler 非静态内部类和匿名内部类容易造成内存泄漏 private Handler mRemoteHand ...
- ext图片预览功能实现,前端代码
效果图: extjs代码: // 模型 Ext.define('ParkingAttachment', {extend: "Ext.data.Model", idProperty: ...
- [20190402]Library Cache mutex.txt
[20190402]Library Cache mutex.txt 1.环境:SCOTT@book> @ ver1PORT_STRING VERSION ...
- Python爬虫之Beautiful Soup库的基本使用
- laravel部署创建新项目 助记
打开进入homestead虚拟机,并进入code文件夹 cd ~/homestead && vagrant up && vagrant ssh cd ~/Code 进行 ...
- [RHEL 6]GPT分区--parted
对于2T以上的硬盘,划分分区表需要GPT分区,RHEL 6中使用parted进行分区 用法:parted [选项]... [设备 [命令 [参数]...]...] 将带有“参数”的命令应用于“设备”. ...
- LeetCode算法题-Student Attendance Record I(Java实现)
这是悦乐书的第258次更新,第271篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第125题(顺位题号是551).您将获得一个表示学生出勤记录的字符串. 该记录仅包含以下 ...
- Django REST framework基础:分页
DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...
- Log4j配置文件详解及实例
1 ) . 配置根 Logger ,其语法为: log4j.rootLogger = [ level ] , appenderName, appenderName, … 其中, level 是日 ...
- C#中指针使用总结(转载)
C#为了类型安全,默认并不支持指针.但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式.在不安全模式下,我们可以直接操作内存,这样就可以使用 ...