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运 ...
随机推荐
- c/c++ 网络编程 UDP 改变网卡的硬件地址
网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...
- PHP程序污点型漏洞静态检测方法
这篇文献,作者针对基于PHP语言开发的web应用程序产生的污点型漏洞,提出了一种静态代码分析检测的方法. 先解释一下什么叫污点型漏洞,由于对于用户的输入没有进行有效的过滤,使其进入敏感函数 ...
- redis.clients.jedis.exceptions.JedisDataException: ERR invalid DB index
添加redis配置文件, 启动后,调用报错 redis.clients.jedis.exceptions.JedisDataException: ERR invalid DB index ERR i ...
- django 模型层(2)
Django 模型层(2) 多表操作---模型之间的关系 1 一对一:作者----作者详细信息 2 一对多:书籍----出版社 3 多对多:书籍----作者 一 创建模型(主键(id)自动创建) 没 ...
- IDEA 相关整理
插件部分 Lombok 日志不定义
- vim之快速查找功能
vim有强大的字符串查找功能. 我们通常在vim下要查找字符串的时候, 都是输入 / 或者 ? 加 需要查找的字符串来进行搜索,比如想搜索 super 这个单词, 可以输入 /super 或者 ...
- UVALive - 4287 - Proving Equivalences(强连通分量)
Problem UVALive - 4287 - Proving Equivalences Time Limit: 3000 mSec Problem Description Input Outp ...
- SpringBoot中使用Servlet,Filter,Listener
项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...
- python错误和调试
在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的. 有的错误是用户输入造成的,比如让用 ...
- SoapUI 学习总结-02 断言
一 断言 测试指定的restful api是否正常,判断它的响应值是否符合预期标准,需要用到断言知识.在soapUI里断言使用的Groovy语言.在项目中测试起来非常简单,测试过程如下. 1,准备测试 ...