小编Fab*_*ien的帖子

什么是C的三元运算符的惯用Go?

在C/C++(以及该系列的许多语言)中,根据条件声明和初始化变量的常用习惯用法是使用三元条件运算符:

int index = val > 0 ? val : -val
Run Code Online (Sandbox Code Playgroud)

Go没有条件运算符.实现上述相同代码的最惯用方法是什么?我来到以下解决方案,但它似乎相当冗长

var index int

if val > 0 {
    index = val
} else {
    index = -val
}
Run Code Online (Sandbox Code Playgroud)

还有更好的东西吗?

ternary-operator go conditional-operator

248
推荐指数
10
解决办法
15万
查看次数

在Go的http包中,如何在POST请求中获取查询字符串?

我正在使用httpGo中的包来处理POST请求.如何从Request对象访问和解析查询字符串的内容?我无法从官方文档中找到答案.

go query-string

97
推荐指数
6
解决办法
13万
查看次数

用于创建学校时间表的算法

我一直想知道是否有创建学校时间表算法的已知解决方案.基本上,它是关于优化给定班级 - 学科 - 教师协会的"小时分散"(在教师和班级案例中).我们可以假设我们在输入中有相互关联的课程,课程科目和教师,并且时间表应该适合在上午8点到下午4点之间.

我想可能没有准确的算法,但也许有人知道一个很好的近似或开发它的提示.

language-agnostic algorithm np

88
推荐指数
9
解决办法
6万
查看次数

在go中,有没有办法在终止程序时执行代码?

我知道你可以定义init在任何包中调用的函数,这些函数将在之前执行main.我用它来打开我的日志文件和我的数据库连接.

有没有办法定义程序结​​束时要执行的代码,因为它到达main函数的末尾或因为它被中断了?我能想到的唯一方法是terminate在main使用的每个包上手动调用deffered 函数,但这非常冗长且容易出错.

go deferred-execution

24
推荐指数
1
解决办法
7755
查看次数

在Rust中,Haskell的[n..m]的惯用等价物是什么?

如何生成包含Rust中所有整数的列表?我正在寻找相当于Haskell [n..m]或Python的,range(n, m+1)但找不到任何东西.

我知道这个int::range功能,并认为这是我正在寻找的东西,但它是在一个范围内迭代,而不是产生它.

rust

16
推荐指数
4
解决办法
1498
查看次数

在go中,返回结构或错误的惯用方法是什么?

我有一个函数返回a Card,这是一个struct类型,或一个错误.

问题是,如何在发生错误时从函数返回?nil对结构无效,我的Card类型没有有效的零值.

func canFail() (card Card, err error) {
    // return nil, errors.New("Not yet implemented"); // Fails
    return Card{Ace, Spades}, errors.New("not yet implemented"); // Works, but very ugly
}
Run Code Online (Sandbox Code Playgroud)

我找到的唯一解决方法是使用a *Card而不是a Card,a或者nil在出现错误时使用它,或者Card在没有错误发生时将其指向实际,但这非常笨拙.

func canFail() (card *Card, err error) {
    return nil, errors.New("not yet implemented");
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法 ?

编辑:我找到了另一种方式,但不知道这是否是惯用的甚至是好的风格.

func canFail() (card Card, err error) {
    return card, errors.New("not yet implemented")
}
Run Code Online (Sandbox Code Playgroud)

既然card是一个命名的返回值,我可以在不初始化的情况下使用它.它以自己的方式归零,我并不在乎,因为调用函数不应该使用这个值.

error-handling zero go

13
推荐指数
2
解决办法
4426
查看次数

如何在编译期间执行is_pod <T>测试而不执行?

这可能是一个简单的问题,我根本不掌握C++ 11模板.

我有一个通用的矢量类,不是std::vector<T>出于性能原因(非常具体的代码).

我观察到检查是否T是POD,如果是,执行特殊计算,效率要高得多:

void vec<T>::clear() {
  if (!std::is_pod<T>::value) {
    for (int i = 0; i < size; i++) {
       data[i].~T();
    }
  }

  size = 0;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我没有T为每个项目调用析构函数(size可能非常大)并且性能得到了提升.但是if (!std::is_pod<T>::value)一旦编译模板,测试就没用了:而不是编译成:

void vec<int>::clear() {
  if (false) {
    for (int i = 0; i < size; i++) {
       data[i].~int();
    }
  }

  size = 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它被编译为:

void vec<int>::clear() {
  size = 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器"聪明"是否足以跳过if (false)块或if (true)测试?我是否必须以不同的方式编写代码?

c++ templates c++11

12
推荐指数
2
解决办法
675
查看次数

我怎么能做自己的懒惰迭代器?

我正在制作一个产生大量数据的C++ 11类.该数据目前来自数据库,并不能完全适合内存.我想为用户提供一个迭代器,其行为类似于常规的STL迭代器,但这将是懒惰的.更准确地说,我可以做类似的事情:

for (auto& item : big_bunch_of_data) {
    do_stuff_with(item);
}
Run Code Online (Sandbox Code Playgroud)

仅在每次迭代时从数据库中检索项目.如果我是对的,这个新语法就是糖

for (stuff::iterator it = big_bunch_of_data.begin();it != big_bunch_of_data.end();it++) {
    do_stuff_with(*it);
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着通过提供begin,end并且operator++,我可以有所期望的行为?而且,这些方法应该做什么?我的意思是,我可以让他们懒惰而不破坏东西吗?

c++ iterator lazy-evaluation c++11

10
推荐指数
1
解决办法
2401
查看次数

在C++ 11中,如何调用new并为对象保留足够的内存?

我有一个以这种方式描述的类:

class Foo {
    int size;
    int data[0];

public:
    Foo(int _size, int* _data) : size(_size) {
        for (int i = 0 ; i < size ; i++) {
            data[i] = adapt(_data[i]);
        }
    }

    // Other, uninteresting methods
}
Run Code Online (Sandbox Code Playgroud)

我无法改变那门课程的设计.

如何创建该类的实例?在调用构造函数之前,我必须保留足够的内存来存储其数据,因此它必须在堆上,而不是在堆栈上.我想我想要的东西

Foo* place = static_cast<Foo*>(malloc(sizeof(int) + sizeof(int) * size));
*place = new Foo(size, data);  // I mean : "use the memory allocated in place to do your stuff !"
Run Code Online (Sandbox Code Playgroud)

但我找不到办法让它发挥作用.

编辑:正如评论员所注意到的,这不是一个非常好的整体设计(使用非标准技巧data[0]),唉这是一个我不得不使用的库...

c++ memory-management c++11

8
推荐指数
2
解决办法
554
查看次数

如何为Rust中的Vec <T>分配空间?

我想创建一个Vec<T>并为它腾出一些空间,但我不知道该怎么做,令我惊讶的是,官方文档中几乎没有关于这个基本类型的内容.

let mut v: Vec<i32> = Vec<i32>(SIZE); // How do I do this ?

for i in 0..SIZE {
    v[i] = i;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建一个空的Vec<T>并用pushes 填充它,但我不想这样做,因为我不总是知道,当在索引处写入值时i,如果已经插入了一个值.出于明显的性能原因,我不想写下这样的内容:

if i >= len(v) {
    v.push(x);
} else {
    v[i] = x;
}
Run Code Online (Sandbox Code Playgroud)

当然,我也不能使用vec!语法.

vector rust

8
推荐指数
2
解决办法
5684
查看次数