你说的这种叫组合,是将多个已定义的struct组合成一个新的struct。
你可以看看,源码中应该有已定义的decoder
,writer
两个struct。
在新的struct中可以不用定义名称,使用的时候,可以直接当成新struct的属性。
Hi,我是 小小佳
一个phper 喜欢Yii2
擅长后端,喜欢简约,打算走向全栈的不归路 ~
希望能为互联网贡献一份力量
20180712 写了一点nodeJs
20180729 研究io模型中
没有足够的数据
victorruan 赞了回答 · 2019-04-25
你说的这种叫组合,是将多个已定义的struct组合成一个新的struct。
你可以看看,源码中应该有已定义的decoder
,writer
两个struct。
在新的struct中可以不用定义名称,使用的时候,可以直接当成新struct的属性。
你说的这种叫组合,是将多个已定义的struct组合成一个新的struct。你可以看看,源码中应该有已定义的decoder ,writer 两个struct。在新的struct中可以不用定义名称,使用的时候,可以直接当成新struct的属性。
关注 4 回答 3
victorruan 赞了回答 · 2019-04-25
原来要这样,声明全局变量及类型,类型用反射获取,然后把逻辑写在init函数中,init函数在main函数之前执行。
package main
import (
"os"
"log"
)
var FOB *os.File
func init(){
var err error
var filename = "./file.txt"
FOB, err = os.OpenFile(filename, os.O_WRONLY | os.O_CREATE | os.O_APPEND, 0666)
if err != nil{
log.Fatalln("open file error", err.Error())
}
}
func main(){
FOB.WriteString("...string...")
FOB.Close()
}
原来要这样,声明全局变量及类型,类型用反射获取,然后把逻辑写在init函数中,init函数在main函数之前执行。 {代码...}
关注 3 回答 4
victorruan 赞了回答 · 2019-04-25
首先有一点错误是,你不能把 doFunc1 和 doFunc2 这 2 个类型当作参数传到函数里。
其次你需要声明这么一个接口:
type doFunc interface {
do()
}
总的样子应该是这样:
type DoFunc interface {
do()
}
//方法1
type doFunc1 struct{}
func (*doFunc1) do() {
fmt.Println("执行了方法1")
}
//方法2
type doFunc2 struct{}
func (*doFunc2) do() {
fmt.Println("执行了方法2")
}
func factory(doFunc DoFunc) {
doFunc.do()
}
// 还可以这样写
// func factory(doFunc interface{}) {
// doFunc.(DoFunc).do()
// }
func main() {
var (
a doFunc1
b doFunc2
)
factory(&a) //输出“执行了方法1”
factory(&b) //输出“执行了方法2”
}
首先有一点错误是,你不能把 doFunc1 和 doFunc2 这 2 个类型当作参数传到函数里。 其次你需要声明这么一个接口: {代码...} 总的样子应该是这样: {代码...}
关注 2 回答 1
victorruan 赞了回答 · 2019-04-25
map、slice 以及 int 等这些基础数据类型都会出现并发安全问题。经常使用 map 是因为 map 比较典型,经常会有这方面的错误。
map、slice 以及 int 等这些基础数据类型都会出现并发安全问题。经常使用 map 是因为 map 比较典型,经常会有这方面的错误。
关注 7 回答 4
victorruan 收藏了问题 · 2019-04-25
在阅读《go语言圣经》这本数中,对 “并发的循环” 这个章节中,使用 WaitGoup
处理 goroutines 泄漏的描述未看懂,请各位指教。
书中描述说:
如果等待操作被放在了main goroutine中,在循环之前,这样的话就永远都不会结束了
我不明白这里为什么一定要把 wg.Wait()
放到一个goroutine中去执行呢?为什么放到 main goroutine 中,就永远不会结束了?
// 请把代码文本粘贴到下方(请勿用图片代替代码)
func makeThumbnails6(filenames <-chan string) int64 {
sizes := make(chan int64)
var wg sync.WaitGroup // number of working goroutines
for f := range filenames {
wg.Add(1)
// worker
go func(f string) {
defer wg.Done()
thumb, err := thumbnail.ImageFile(f)
if err != nil {
log.Println(err)
return
}
info, _ := os.Stat(thumb) // OK to ignore error
sizes <- info.Size()
}(f)
}
// closer
go func() { // 为什么一定要在goroutine中进行执行?
wg.Wait()
close(sizes)
}()
var total int64
for size := range sizes {
total += size
}
return total
}
在阅读《go语言圣经》这本数中,对 “并发的循环” 这个章节中,使用 WaitGoup 处理 goroutines 泄漏的描述未看懂,请各位指教。
victorruan 赞了问题 · 2019-04-25
在阅读《go语言圣经》这本数中,对 “并发的循环” 这个章节中,使用 WaitGoup
处理 goroutines 泄漏的描述未看懂,请各位指教。
书中描述说:
如果等待操作被放在了main goroutine中,在循环之前,这样的话就永远都不会结束了
我不明白这里为什么一定要把 wg.Wait()
放到一个goroutine中去执行呢?为什么放到 main goroutine 中,就永远不会结束了?
// 请把代码文本粘贴到下方(请勿用图片代替代码)
func makeThumbnails6(filenames <-chan string) int64 {
sizes := make(chan int64)
var wg sync.WaitGroup // number of working goroutines
for f := range filenames {
wg.Add(1)
// worker
go func(f string) {
defer wg.Done()
thumb, err := thumbnail.ImageFile(f)
if err != nil {
log.Println(err)
return
}
info, _ := os.Stat(thumb) // OK to ignore error
sizes <- info.Size()
}(f)
}
// closer
go func() { // 为什么一定要在goroutine中进行执行?
wg.Wait()
close(sizes)
}()
var total int64
for size := range sizes {
total += size
}
return total
}
在阅读《go语言圣经》这本数中,对 “并发的循环” 这个章节中,使用 WaitGoup 处理 goroutines 泄漏的描述未看懂,请各位指教。
关注 5 回答 2
victorruan 关注了问题 · 2019-04-25
在阅读《go语言圣经》这本数中,对 “并发的循环” 这个章节中,使用 WaitGoup
处理 goroutines 泄漏的描述未看懂,请各位指教。
书中描述说:
如果等待操作被放在了main goroutine中,在循环之前,这样的话就永远都不会结束了
我不明白这里为什么一定要把 wg.Wait()
放到一个goroutine中去执行呢?为什么放到 main goroutine 中,就永远不会结束了?
// 请把代码文本粘贴到下方(请勿用图片代替代码)
func makeThumbnails6(filenames <-chan string) int64 {
sizes := make(chan int64)
var wg sync.WaitGroup // number of working goroutines
for f := range filenames {
wg.Add(1)
// worker
go func(f string) {
defer wg.Done()
thumb, err := thumbnail.ImageFile(f)
if err != nil {
log.Println(err)
return
}
info, _ := os.Stat(thumb) // OK to ignore error
sizes <- info.Size()
}(f)
}
// closer
go func() { // 为什么一定要在goroutine中进行执行?
wg.Wait()
close(sizes)
}()
var total int64
for size := range sizes {
total += size
}
return total
}
关注 5 回答 2
victorruan 关注了问题 · 2019-04-25
go 中有一个数据类型 是 byte.
怎么理解这个数据类型的应用场景?
看代码过程中看到经常使用这个,但感觉有些直接使用 string 类型也可以。
那么 byte 这个类型的应用场景是什么?为什么要用它?
关注 3 回答 1
victorruan 关注了标签 · 2019-04-25
Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。
Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。Go是谷歌2009发布的第二款编程语言。
七牛云存储CEO许式伟出版《Go语言编程》
go语言翻译项目 http://code.google.com/p/gola...
《go编程导读》 http://code.google.com/p/ac-m...
golang的官方文档 http://golang.org/doc/docs.html
golang windows上安装 http://code.google.com/p/gomi...
Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。 Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复...
关注 26105
victorruan 发布了文章 · 2018-11-05
Redis pipeline 在连续一万次插入操作测试中的使用中
如下代码运行后的结果是
10000noPipeline:0.36595296859741s
10000yesPipeline:0.016739130020142s
可以看出pipeline确实可以节省很多时间
<?php
/**
* 这里我想测试下Redis pipeline的功能
*/
function main(){
$redis = new Redis();
$redis->connect("127.0.0.1");
$redis->flushAll();
$start_time = microtime(true);
noPipeline($redis);
$end_time = microtime(true);
echo "noPipeline:".($end_time - $start_time)."s\n";
$redis->flushAll();
$start_time = microtime(true);
yesPipeline($redis);
$end_time = microtime(true);
echo "yesPipeline:".($end_time - $start_time)."s\n";;
}
function noPipeline(Redis $redis)
{
$i = 0;
while ($i < 10000) {
$redis->incr("x");
$i++;
}
echo $redis->get("x");
}
function yesPipeline(Redis $redis)
{
$pipe = $redis->multi(Redis::PIPELINE);
$i = 0;
while ($i < 10000) {
$pipe->incr("x");
$i++;
}
$pipe->exec();
echo $redis->get("x");
}
main();
/*
* 10000noPipeline:0.36595296859741s
* 10000yesPipeline:0.016739130020142s
*/
查看原文Redis pipeline 在连续一万次插入操作测试中的使用中如下代码运行后的结果是 {代码...} 可以看出pipeline确实可以节省很多时间 {代码...}
赞 0 收藏 0 评论 0
查看全部 个人动态 →
这是生成yii2 api文档的工具
这是一个为了装B自实现的php的MVC框架. 特点是基于php-cli实现web服务器. 不需要nginx等web容器支持.
个人博客
注册于 2016-07-08
个人主页被 1.1k 人浏览
推荐关注