victorruan

victorruan 查看完整档案

上海编辑哈尔滨工业大学  |  信息安全 编辑自由职业  |  全栈工程师 编辑 blog.victorruan.cn 编辑
编辑

Hi,我是 小小佳
一个phper 喜欢Yii2
擅长后端,喜欢简约,打算走向全栈的不归路 ~
希望能为互联网贡献一份力量

20180712 写了一点nodeJs

20180729 研究io模型中

个人动态

victorruan 赞了回答 · 2019-04-25

解决golang struct 可以不声明成员类型吗?

你说的这种叫组合,是将多个已定义的struct组合成一个新的struct。
你可以看看,源码中应该有已定义的decoder ,writer 两个struct。
在新的struct中可以不用定义名称,使用的时候,可以直接当成新struct的属性。

关注 4 回答 3

victorruan 赞了回答 · 2019-04-25

解决golang怎么像python一样把逻辑写在函数外面?

原来要这样,声明全局变量及类型,类型用反射获取,然后把逻辑写在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()
}

关注 3 回答 4

victorruan 赞了回答 · 2019-04-25

解决golang中如何将抽象的struct作为类型,使得struct传入func中??请看代码

首先有一点错误是,你不能把 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”
}

关注 2 回答 1

victorruan 赞了回答 · 2019-04-25

为什么在 go 中总是针对 map 这个数据类型来讨论非并发安全?

map、slice 以及 int 等这些基础数据类型都会出现并发安全问题。经常使用 map 是因为 map 比较典型,经常会有这方面的错误。

关注 7 回答 4

victorruan 收藏了问题 · 2019-04-25

Go语言关于 goroutines 泄漏的一个问题

问题描述

在阅读《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
}

victorruan 赞了问题 · 2019-04-25

解决Go语言关于 goroutines 泄漏的一个问题

问题描述

在阅读《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语言关于 goroutines 泄漏的一个问题

问题描述

在阅读《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 的应用场景

go 中有一个数据类型 是 byte.
怎么理解这个数据类型的应用场景?
看代码过程中看到经常使用这个,但感觉有些直接使用 string 类型也可以。
那么 byte 这个类型的应用场景是什么?为什么要用它?

关注 3 回答 1

victorruan 关注了标签 · 2019-04-25

golang

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...

关注 26105

victorruan 发布了文章 · 2018-11-05

Redis pipeline 在连续一万次插入操作测试中的使用

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
 */
查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 36 次点赞
  • 获得 10 枚徽章 获得 0 枚金徽章, 获得 1 枚银徽章, 获得 9 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

  • yii2-apidoc

    这是生成yii2 api文档的工具

  • victorruan

    这是一个为了装B自实现的php的MVC框架. 特点是基于php-cli实现web服务器. 不需要nginx等web容器支持.

  • yii2-blog

    个人博客

注册于 2016-07-08
个人主页被 1.1k 人浏览