英文:
type assertion of custom type in go using interface{}
问题
你好,我是你的中文翻译助手。以下是你要翻译的内容:
嗨,我是Go语言的新手,我正在尝试在Go中实现数据结构和算法作为学习过程。我试图将接口用作泛型值,但似乎无法使我的自定义顶点类型正常工作。我在下面附上了一个Go Playground的链接:
type Vertex struct{
Adjacent DoubleLinkedList.DLinkedList
Weight int
Origin int
}
type UGraph struct{
Vertices map[int]DoubleLinkedList.DLinkedList
Weight int
counter int
VerticesList []*Vertex
}
func (UG *UGraph) BFS(node *Vertex, Value interface{})(int) {
visited := make(map[*Vertex]bool) // 作为集合的映射
var queue Queue.Queue
queue.Enqueue(node)
for queue.Store.Size > 0 {
V, _ := queue.Dequeue()
nodes := UG.Vertices[((V).(Vertex).Origin).(int64)]
head := nodes.Head
for head.Next != nil {
head = head.Next
if head.Value == Value{
return head.Value.Origin
}
if visited[(head.Value.Origin).(int64)] != true{
visited[head.Value.Origin] = true
queue.Enqueue(head)
}
}
}
return 0
}
链接:https://go.dev/play/p/s3t9LCfBlRI
英文:
Hi Im new to go and I'm trying implement data structures and algos in go as a learning process. I am trying to interfaces as generics values but I cannot seem to get my custom type of vertex to function properly. I have attached a link to a go playground
type Vertex struct{
Adjacent DoubleLinkedList.DLinkedList
Weight int
Origin int
}
type UGraph struct{
Vertices map[int]DoubleLinkedList.DLinkedList
Weight int
counter int
VerticesList []*Vertex
}
func (UG *UGraph) BFS(node *Vertex, Value interface{})(int) {
visited := make(map[*Vertex]bool) // map that acts as a set
var queue Queue.Queue
queue.Enqueue(node)
for queue.Store.Size > 0 {
V, _ := queue.Dequeue()
nodes := UG.Vertices[((V).(Vertex).Origin).(int64)]
head := nodes.Head
for head.Next != nil {
head = head.Next
if head.Value == Value{
return head.Value.Origin
}
if visited[(head.Value.Origin).(int64)] != true{
visited[head.Value.Origin] = true
queue.Enqueue(head)
}
}
}
return 0
}
答案1
得分: 1
如果我正确理解你的问题,这似乎是你的起点:
你需要一个支持泛型的队列。然后你需要更新所有的结构来处理一个像下面示例中的 T 泛型类型。
请注意,一旦你的结构体中有了类型 T,你的方法签名必须更新。
你不需要在每个类型上使用泛型。你可以使用一个已有类型的字段,比如 Queue[int]。
在这里,我们将考虑你希望所有都是泛型的。
享受吧!
type DListNode[T any] struct {
Prev *DListNode[T]
Next *DListNode[T]
Value T
}
func (DLL *DLinkedList[T]) AddFront(value T) {
…
}
type Queue[T any] struct {
Store DLinkedList[T] // consider store a pointer
Capacity int
Front T
Rear T
}
func (QQ *Queue[T]) Enqueue(value T) error {
…
}
func (QQ *Queue[T]) Dequeue() (T, error) {
if QQ.isEmpty() {
var zero T
return zero, fmt.Errorf("Queue is currently Empty")
}
…
}
…
// 省略一些步骤,你最终需要这个:
func (UG *UGraph[T]) BFS(node *Vertex[T], value T) T {
英文:
If I understand correctly your issue, this seems to be your starting point:
You need a Queue with generics support. Then you need to update all structures to handle a T generic type like in the example below.
Be aware that once you have a type T in your struct, your method signature must be updated
You don’t need to use Generics on each type. You may want to use a field with an existing type like Queue[int]
Here we will consider you want all be generic
Enjoy
type DListNode[T any] struct {
Prev *DListNode[T]
Next *DListNode[T]
Value T
}
func (DLL *DLinkedList[T]) AddFront(value T) {
…
}
type Queue[T any] struct {
Store DLinkedList[T] // consider store a pointer
Capacity int
Front T
Rear T
}
func (QQ *Queue[T]) Enqueue(value T) error {
…
}
func (QQ *Queue[T]) Dequeue() (T, error) {
if QQ.isEmpty() {
var zero T
return zero, fmt.Errorf("Queue is currently Empty")
}
…
}
…
// omitting some steps, you can see that you need this in the end:
func (UG *UGraph[T]) BFS(node *Vertex[T], value T) T {
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论