既然类型参数可以在 上使用golang/go:master,我决定尝试一下。看来我遇到了在类型参数提案中找不到的限制。(或者我一定错过了)。
我想编写一个函数,它返回带有接口类型约束的泛型类型值的切片。如果传递的类型是带有指针接收器的实现,我们如何实例化它?
type SetGetter[V any] interface {
Set(V)
Get() V
}
// SetGetterSlice turns a slice of type V into a slice of type T,
// with T.Set() called for each entry in values.
func SetGetterSlice[V any, T SetGetter[V]](values []V) []T {
out := make([]T, len(values))
for i, v := range values {
out[i].Set(v) // panic if T has pointer receiver!
}
return out
}
Run Code Online (Sandbox Code Playgroud)
当使用类型 as调用上述SetGetterSlice()函数时,此代码将在调用时出现混乱。(Go2go游乐场)毫不奇怪,因为基本上代码创建了一个指针切片:*CountTSet(v)nil …
所以我有一个指针数组的指针.如果我这样删除它:
delete [] PointerToPointers;
Run Code Online (Sandbox Code Playgroud)
那会删除所有指向的指针吗?如果没有,我是否必须遍历所有指针并删除它们,或者有更简单的方法吗?我的google-fu似乎没有给我任何关于这个问题的好答案.
(是的,我知道我需要使用一个向量.这是学校中"赶上C++"类型作业之一.)
我想在char数组中存储一个4字节的int ...这样char数组的前4个位置就是int的4个字节.
然后,我想把int拉出数组......
此外,如果有人可以给我代码在循环中执行此操作,奖励积分... IE写入8字节到32字节数组.
int har = 0x01010101;
char a[4];
int har2;
// write har into char such that:
// a[0] == 0x01, a[1] == 0x01, a[2] == 0x01, a[3] == 0x01 etc.....
// then, pull the bytes out of the array such that:
// har2 == har
Run Code Online (Sandbox Code Playgroud)
多谢你们!
编辑:假设int有4个字节......
编辑2:请不要关心字节序...我会担心字节序.我只是想用不同的方法来实现C/C++中的上述功能.谢谢
编辑3:如果你不能说,我正在尝试在低级写一个序列化类......所以我正在寻找不同的策略来序列化一些常见的数据类型.
Obj *op = new Obj;
Obj *op2 = op;
delete op;
delete op2; // What happens here?
Run Code Online (Sandbox Code Playgroud)
当你意外地双重删除时,最糟糕的情况是什么?有关系吗?编译器会抛出错误吗?
作为我的第一门编程语言,我学习了Java,但是由于我改为另一所大学,我现在正在学习C++.
来自Java并学习C++的基础知识,我阅读了有关引用和引用变量的内容.它们有多危险,如何小心它们等等.
因此,在我脑海中出现了一个简单的问题:为什么我要使用那种复杂的,因此可能引起问题的东西呢?
它是不是值得,或者只是RAM大约64MB的时候的遗物?
由于很多答案都提到了指针:这个概念显然来自石器时代,imho.除了高性能计算,我甚至不会触及那些东西.
我一直在关注米切尔,奥尔德姆和塞缪尔的高级Linux编程.我在pthreads一节中看到过一些关于void指针和转换的东西让我很困惑.
将参数传递给pthread_create(),它们不会将指针强制转换为void指针,即使这是函数所期望的.
pthread_create( &thread, NULL, &compute_prime, &which_prime );
Run Code Online (Sandbox Code Playgroud)
这里,which_prime的类型为int.
但是使用pthread_join从线程返回一个值,他们将变量转换为void指针.
pthread_join( thread, (void*) &prime );
Run Code Online (Sandbox Code Playgroud)
这里,prime再次为int类型.
为什么在第二个实例中而不是在第一个实例中完成转换?
我正在阅读Linux内核上的Beautiful Code中的章节,作者讨论了Linux内核如何在C语言中实现继承(以及其他主题).简而言之,定义了一个"基础"结构,为了从中继承,"子类"结构将基类的副本放在子类结构定义的末尾.然后,作者花了几页来解释一个聪明而复杂的宏,以确定要从对象的基本部分转换为对象的子类部分需要多少字节.
我的问题:在子类struct中,为什么不将struct struct声明为struct中的第一个东西,而不是最后一个?
首先放置基础结构的主要优点是从基类转换到子类时根本不需要移动指针 - 实际上,执行转换只是告诉编译器让代码使用'额外'子类struct在基类定义的东西之后放置的字段.
只是为了澄清我的问题,让我抛出一些代码:
struct device { // this is the 'base class' struct
int a;
int b;
//etc
}
struct usb_device { // this is the 'subclass' struct
int usb_a;
int usb_b;
struct device dev; // This is what confuses me -
// why put this here, rather than before usb_a?
}
Run Code Online (Sandbox Code Playgroud)
如果碰巧有一个指向usb_device对象内部的"dev"字段的指针,那么为了将其强制转换回该usb_device对象,需要从该指针中减去8.但是如果"dev"是usb_device中的第一个东西,那么指针根本就不需要移动指针.
任何有关这方面的帮助将不胜感激.甚至关于在何处找到答案的建议也会受到赞赏 - 我不太确定谷歌如何为这样的决定背后的架构原因.我在StackOverflow上找到的最接近的是: 为什么要使用这些奇怪的嵌套结构
而且,要明确一点 - 我知道很多聪明的人已经在Linux内核上工作了很长时间,所以很明显这样做是有充分理由的,我只是无法弄清楚它是什么.
我只需要一个指向time.Time的指针,所以下面的代码似乎无效:
./c.go:5:不能取时间地址.现在()
我只是想知道为什么?有没有办法做到这一点,除了先对变量赋值并获取变量的指针?
package main
import "time"
func main() {
_ = &time.Now()
}
Run Code Online (Sandbox Code Playgroud) [这是一个受到其他地方最近讨论的启发的问题,我会用它来提供答案.]
我想知道数组"衰减"指针的奇怪C现象,例如当用作函数参数时.这似乎是不安全的.用它明确地传递长度也是不方便的.我可以通过其他类型的聚合 - 结构 - 完全符合价值; 结构不会腐烂.
这个设计决定背后的理由是什么?它如何与语言集成?为什么结构有区别?
这个声明很混乱:
char* q {new char[1024]{}}; // q[i] becomes 0 for all
Run Code Online (Sandbox Code Playgroud)
这是"指向char数组的char指针" 还是" 指针数组"?
我认为这new char[1024]{}是初始化一个char1024个元素的数组,每个元素的值为0.
所以这和:
char* q = [0,0,....] // until 1024
Run Code Online (Sandbox Code Playgroud)
正确?