第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 golang 中實(shí)現(xiàn)通用鏈表,它不允許同一鏈表中的不同類型

在 golang 中實(shí)現(xiàn)通用鏈表,它不允許同一鏈表中的不同類型

Go
UYOU 2023-06-01 17:58:28
我想制作一個(gè)鏈表,它可以保存任何類型的值,但鏈表必須只保存任何一種類型的值。一般來(lái)說(shuō),當(dāng)我使用接口來(lái)實(shí)現(xiàn)這一點(diǎn)時(shí)——任何實(shí)現(xiàn)節(jié)點(diǎn)接口的類型都可以添加到鏈表中。我為此編寫了一個(gè)實(shí)現(xiàn),每當(dāng)將新鍵添加到鏈表時(shí),都會(huì)根據(jù)頭部鍵的類型檢查鍵的類型。我想了解這是實(shí)現(xiàn)它的正確方法還是有更好的方法。該代碼運(yùn)行良好 - 但我想了解是否有更好或不同的方法來(lái)執(zhí)行此操作。另外 - 當(dāng)前使用反射包檢查類型的性能影響是什么。有沒(méi)有不同的方法來(lái)實(shí)現(xiàn)同樣的事情。*main.Student 類型不受支持的類型Unsupported type for the type *main.Student################################################################################Printing the linked list *main.ComplexNode &{9 90}  9 + i90 *main.ComplexNode &{8 80}  8 + i80 *main.ComplexNode &{7 70}  7 + i70 *main.ComplexNode &{6 60}  6 + i60 *main.ComplexNode &{5 50}  5 + i50 *main.ComplexNode &{4 40}  4 + i40 *main.ComplexNode &{3 30}  3 + i30 *main.ComplexNode &{2 20}  2 + i20 *main.ComplexNode &{1 10}  1 + i10################################################################################
查看完整描述

2 回答

?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊

好消息,從 Go 1.18 開始,Go 現(xiàn)在支持泛型。

按照問(wèn)題中的示例,這里是一個(gè)使用泛型的簡(jiǎn)化 LinkedList。您可以在此處的操場(chǎng)上修改它。

package main


import "fmt"


type MyNode[T any] struct {

? ? next? *MyNode[T]

? ? value T

}


type MyLinkedList[T any] struct {

? ? head *MyNode[T]

? ? tail *MyNode[T]

}


func (list *MyLinkedList[T]) Add(t T) *MyLinkedList[T] {

? ? // create node

? ? node := &MyNode[T]{nil, t}

? ? // if first node in list

? ? if list.head == nil {

? ? ? ? list.head = node

? ? ? ? list.tail = node

? ? } else {

? ? ? ? list.tail.next = node

? ? ? ? list.tail = list.tail.next

? ? }


? ? return list

}


func (list *MyLinkedList[T]) AddBeforeHead(t T) *MyLinkedList[T] {

? ? node := &MyNode[T]{nil, t}

? ? if list.head != nil {

? ? ? ? node.next = list.head

? ? ? ? list.head = node

? ? } else {

? ? ? ? // make head

? ? ? ? list.head = node

? ? ? ? list.tail = node

? ? }


? ? return list

}


// display the list

func DisplayList[T any](list *MyLinkedList[T]) string {

? ? var out string = ""

? ? iter := list.head

? ? for iter != nil {

? ? ? ? out += fmt.Sprintf("%v -> ", iter.value)

? ? ? ? iter = iter.next

? ? }

? ? return out

}


func (list *MyLinkedList[T]) Display() string {

? ? return DisplayList(list)

}


// for printing node value

// you could also implement Stringer

// but this is besides the point, you can ignore

func (node *MyNode[T]) String() string {

? ? return fmt.Sprintf("<MyNode: %v>", node.value)

}


// helper func: create list from array

func CreateLinkedList[T any](arr []T) *MyLinkedList[T] {

? ? list := &MyLinkedList[T]{}


? ? for _, v := range arr {

? ? ? ? list.Add(v)

? ? }


? ? return list

}


func main() {

? ? // create a list from array of integers

? ? intArr := []int{10, 20, 30, 40, 50, 60}

? ? list1 := CreateLinkedList(intArr)

? ? // create a list from array of strings

? ? strArr := []string{"foo", "bar", "baz", "faz"}

? ? list2 := CreateLinkedList(strArr)


? ? // test inserting at the beginning

? ? list2.AddBeforeHead("hello")


? ? fmt.Println(list1.Display())

? ? fmt.Println(list2.Display())

}


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
長(zhǎng)風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

您可以通過(guò)使用接口和運(yùn)行時(shí)檢查(正如您所發(fā)現(xiàn)的那樣)或使用代碼生成來(lái)做到這一點(diǎn)。這些是您在 Go 中用于泛型編程的當(dāng)前選項(xiàng)。Go 團(tuán)隊(duì)正在努力為語(yǔ)言添加泛型——這是一項(xiàng)正在進(jìn)行的工作,每個(gè)人都可以自由參與討論。一旦泛型存在,它們將提供您在這里尋求的解決方案。

至于接口與代碼生成,有你提到的性能影響。代碼生成將生成更緊湊的代碼,不需要對(duì)大多數(shù)操作進(jìn)行運(yùn)行時(shí)檢查;另一方面,它為項(xiàng)目的構(gòu)建過(guò)程增加了一些復(fù)雜性。這些是在運(yùn)行時(shí)解決某些事情與在編譯時(shí)預(yù)先計(jì)算事情的通常權(quán)衡。


查看完整回答
反對(duì) 回復(fù) 2023-06-01
  • 2 回答
  • 0 關(guān)注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)