我正在通过编写一个小型的个人项目来学习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 …
我的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_x并implement_x_rebased分别在完全相同的状态-将不会有合并冲突,只应用之间的变化implement_x和further_foo_fixes_that_depend_on_x等之上implement_x_rebased.然而,似乎git并不那么聪明,并且它试图从基础一路变换 - 引入不必要的合并冲突.
我认为简单的出路是rebase&squash进一步修复implement_x然后隐藏它们,然后应用stashes implement_x_rebased,但我很好奇是否有任何正确的方法让git意识到implement_x并且implement_x_rebased实际上处于相同的状态?
我有一个依赖于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
我如何得到 …
我正在尝试使用 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?
我的程序有一个管道结构,我刚刚实现了一个缓存过滤器,如果已经处理过的数据版本在缓存中,它会直接将内容发送到输出。
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) 我正在尝试获取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的仪器肯定可以看到功能名称,所以它们就在那里!)如果可能的话,我是否需要采取一些额外的步骤,或者我只是做错了什么?
我正在尝试使用UDP在网络上发送32位浮点数向量.该UdpSocket.send_to(buf, dst)方法接受一个8位uint切片.我想将它作为一个传递给它&[u8].我该如何做到这一点?我没有从API中找到任何相关的转换方法.
在这种情况下无需关心字节序.然而.
我正在尝试为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 ×4
go ×2
browser ×1
channel ×1
dtrace ×1
generics ×1
git ×1
git-rebase ×1
interface ×1
javascript ×1
macos ×1
mocking ×1
musl ×1
profiling ×1
rust-cargo ×1
stack-trace ×1
unit-testing ×1
webassembly ×1