小编Gol*_*nks的帖子

Go中的模拟函数

我正在通过编写一个小型的个人项目来学习Go.虽然它很小,但我决定从一开始就进行严格的单元测试,以便在Go上学习好习惯.

琐碎的单元测试都很好,花花公子,但我现在对依赖感到困惑; 我希望能够用模拟函数替换一些函数调用.这是我的代码片段:

func get_page(url string) string {
    get_dl_slot(url)
    defer free_dl_slot(url)

    resp, err := http.Get(url)
    if err != nil { return "" }
    defer resp.Body.Close()

    contents, err := ioutil.ReadAll(resp.Body)
    if err != nil { return "" }
    return string(contents)
}

func downloader() {
    dl_slots = make(chan bool, DL_SLOT_AMOUNT) // Init the download slot semaphore
    content := get_page(BASE_URL)
    links_regexp := regexp.MustCompile(LIST_LINK_REGEXP)
    matches := links_regexp.FindAllStringSubmatch(content, -1)
    for _, match := range matches{
        go serie_dl(match[1], match[2])
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够测试downloader()而不实际通过http获取页面 - 即通过模拟get_page(更容易,因为它只返回页面内容作为字符串)或http.Get().

我找到了这个帖子:https …

unit-testing mocking go

129
推荐指数
4
解决办法
8万
查看次数

如何重新定位已经重新定位的分支机构

我的git分支看起来像这样:

master-*-*-*-*-*-*-implement_x
 \                    \-*-further_foo_fixes_that_depend_on_x
  \                    \-*-*-further_bar_fixes_that_depend_on_x
   \
    \-implement_x_rebased
Run Code Online (Sandbox Code Playgroud)

它以这种方式结束,因为我认为我的分支implement_x将在上游合并,但我被要求将其压缩到单个提交,因此implement_x_rebased.但是,我已经启动了几个分支机构,以便进一步修复和开发依赖于我的工作,同时等待implement_x合并.

现在我想重新开始进一步的工作implement_x_rebased.我认为这是一个空操作,因为implement_ximplement_x_rebased分别在完全相同的状态-将不会有合并冲突,只应用之间的变化implement_xfurther_foo_fixes_that_depend_on_x等之上implement_x_rebased.然而,似乎git并不那么聪明,并且它试图从基础一路变换 - 引入不必要的合并冲突.

我认为简单的出路是rebase&squash进一步修复implement_x然后隐藏它们,然后应用stashes implement_x_rebased,但我很好奇是否有任何正确的方法让git意识到implement_x并且implement_x_rebased实际上处于相同的状态?

git git-rebase

7
推荐指数
1
解决办法
2689
查看次数

如何使用本机依赖项编译Rust项目的静态musl二进制文件?

我有一个依赖于Hyper和Diesel的项目,因此,在本机库OpenSSL和libpq上.该项目建立在每晚Rust上,因为它使用编译器插件.

我目前的尝试是建立在Docker容器上.我有MUSL libc和库make'd并安装了前缀/usr/local/musl.我cargo使用以下命令运行:(不确定某些选项是否冗余,我不太熟悉编译器链,甚至不确定它们是否最终到链接器,但我必须尝试,对.)

LDFLAGS="-static -L/usr/local/musl/lib" \
LD_LIBRARY_PATH=/usr/local/musl/lib:$LD_LIBRARY_PATH \
CFLAGS="-I/usr/local/musl/include" \
PKG_CONFIG_PATH=/usr/local/musl/lib/pkgconfig \
cargo build --release --target=x86_64-unknown-linux-musl
Run Code Online (Sandbox Code Playgroud)

当我ldd得到的文件,它揭示了这个:

$ ldd server
linux-vdso.so.1 (0x00007fffb878e000)
libpq.so.5 => /usr/local/musl/lib/libpq.so.5 (0x00007f4d730e7000)
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f4d72e82000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f4d72a85000)
libc.so => /usr/local/musl/lib/libc.so (0x00007f4d727f6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4d725f2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4d72246000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x000055e2124a2000)
Run Code Online (Sandbox Code Playgroud)

有所有动态链接的东西,有些甚至与"x86_64-linux-gnu"链!什么地方出了错?

我可以毫无问题地制作静态链接,简单的纯Rust项目.ldd说它们是静态链接的,它们运行没有问题,不像我遇到问题的可执行文件.

当我使用--verbose与货物,我得到了下面rustc的命令,即实际编制的可执行文件:http://pastebin.com/ywv0zNBK(哎呀,这人有一个自定义的outdir-Z print-link-args,由我添加)添加print-link-args标志,我得到了下面的链接器命令:http://pastebin.com/Aw43qd7h

我如何得到 …

static-linking rust rust-cargo musl

6
推荐指数
2
解决办法
2770
查看次数

如何在本地加载 wasm 模块?

我正在尝试使用 JavaScript 和 WebAssembly 制作一个简单的、自包含的(只有一个 .html 文件和一个 .wasm 文件)离线数据可视化。但是,我在从本地文件加载 WASM 模块时遇到了麻烦。

第一个麻烦是CORS。尝试使用相对或file://URL加载任何 JS 模块会导致安全错误。在 Firefox 上,我设法禁用了本地 CORS,但这令人讨厌且过于宽容。在 Chrome 上,我需要用标志启动浏览器。从用户的角度来看,这些都不是入门者。有没有办法从本地文件加载 JS 或 WASM 模块而不会遇到 CORS 问题?

绕过 CORS,第二个麻烦是,虽然 Firefox 能够加载 JS 模块,但它会因 WASM 模块而失败:(我的实际错误消息是日文的,但我认为这是英文的)“加载失败”。 wasm”与来源'。没有显示更多信息。在 Chrome 上,错误消息是“无法加载模块脚本:服务器以非 JavaScript MIME 类型“”响应。根据 HTML 规范对模块脚本执行严格的 MIME 类型检查。',这表明两种浏览器可能都无法猜测 MIME 类型。

这两个问题都可以通过设置 HTTP 服务器来解决,但这完全违背了拥有一个只需要浏览器运行的简单、自包含文件的目的。

有没有办法只用本地文件加载和调用 WASM?

javascript browser webassembly

6
推荐指数
2
解决办法
1561
查看次数

在 Go 中将事物通道作为接口通道传递

我的程序有一个管道结构,我刚刚实现了一个缓存过滤器,如果已经处理过的数据版本在缓存中,它会直接将内容发送到输出。

func Run(in chan downloader.ReadyDownload) chan CCFile {
    out := make(chan CCFile)
    processQueue := make(chan downloader.ReadyDownload)
    go cache.BypassFilter(in, processQueue, out)
        // writes the cached, already processed version to out if it exists
        // otherwise redirects the input to processQueue
    go process(processQueue, out)
    return out
}
Run Code Online (Sandbox Code Playgroud)

问题是我的程序有多个这样的地方,并且通过通道传递了许多类型的结构(如此代码段中的 ReadyDownload 和 CCFile)。他们都实现了这个接口

type ProcessItem interface {
    Source() string
    Target() string
    Key() string
}
Run Code Online (Sandbox Code Playgroud)

所以我的 BypassFilter() 函数签名如下所示:

func (c Cache) BypassFilter(in chan ProcessItem, process chan ProcessItem, bypass chan ProcessItem)
Run Code Online (Sandbox Code Playgroud)

但这会带来以下错误:

cannot use in (type …
Run Code Online (Sandbox Code Playgroud)

generics interface channel go

5
推荐指数
1
解决办法
4077
查看次数

使用DTrace在Rust上获取堆栈跟踪/分析数据

我正在尝试获取Rust代码的漂亮火焰图.不幸的是,Xcode 8.3不再支持导出分析数据了,所以我一直在尝试使用DTrace来获取分析数据.

我在我Cargo.toml的发布二进制文件中启用了调试信息:

[profile.release]
debug = true
Run Code Online (Sandbox Code Playgroud)

然后我运行发布二进制文件(mybinaryname),并使用DTrace示例堆栈跟踪:

sudo dtrace -n 'profile-997 /execname == "mybinaryname"/ { @[ustack(100)] = count(); }' -o out.user_stacks
Run Code Online (Sandbox Code Playgroud)

最终结果是这样的:

          0x10e960500
          0x10e964632
          0x10e9659e0
          0x10e937edd
          0x10e92aae2
          0x10e92d0d7
          0x10e982c8b
          0x10e981fc1
          0x7fff93c70235
          0x1
            1
Run Code Online (Sandbox Code Playgroud)

为了比较,得到的痕迹iTerm2让我得到了很好的痕迹:

          CoreFoundation`-[__NSArrayM removeAllObjects]
          AppKit`_NSGestureRecognizerUpdate+0x769
          CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__+0x17
          CoreFoundation`__CFRunLoopDoObservers+0x187
          CoreFoundation`__CFRunLoopRun+0x4be
          CoreFoundation`CFRunLoopRunSpecific+0x1a4
          HIToolbox`RunCurrentEventLoopInMode+0xf0
          HIToolbox`ReceiveNextEventCommon+0x1b0
          HIToolbox`_BlockUntilNextEventMatchingListInModeWithFilter+0x47
          AppKit`_DPSNextEvent+0x460
          AppKit`-[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:]+0xaec
          AppKit`-[NSApplication run]+0x39e
          AppKit`NSApplicationMain+0x4d5
          iTerm2`main+0x6e
          libdyld.dylib`start+0x1
          iTerm2`0x1
            1
Run Code Online (Sandbox Code Playgroud)

是否可以在Rust代码中获得带有调试信息的堆栈跟踪?(Xcode的仪器肯定可以看到功能名称,所以它们就在那里!)如果可能的话,我是否需要采取一些额外的步骤,或者我只是做错了什么?

macos profiling dtrace stack-trace rust

5
推荐指数
1
解决办法
950
查看次数

如何将不可变视图(切片?)作为八位字节借给矢量?

我正在尝试使用UDP在网络上发送32位浮点数向量.该UdpSocket.send_to(buf, dst)方法接受一个8位uint切片.我想将它作为一个传递给它&[u8].我该如何做到这一点?我没有从API中找到任何相关的转换方法.

在这种情况下无需关心字节序.然而.

type-conversion rust

3
推荐指数
1
解决办法
1230
查看次数

确信编译器将初始化数组的每个索引

我正在尝试为Rand20个元素的缓冲区实现特性,这些元素实现了Rand特征本身.我遍历缓冲区并使用随机值初始化每个元素.但是,我无法说服buff最终完全初始化的编译器.

我该怎么做让它接受这个?

extern crate rand;
use rand::{Rand, Rng};

struct Buf20<T>([T; 20]);

impl<T: Rand> Rand for Buf20<T> {
    fn rand<R: Rng>(rng: &mut R) -> Self {
        let mut buff : [T; 20];
        for element in &mut buff {
            *element = rng.gen();
        }
        Buf20(buff)
    }
}
Run Code Online (Sandbox Code Playgroud)

rust

2
推荐指数
1
解决办法
154
查看次数