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

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

如何聲明和使用可以存儲(chǔ)字符串和 int 值的結(jié)構(gòu)字段?

如何聲明和使用可以存儲(chǔ)字符串和 int 值的結(jié)構(gòu)字段?

Go
楊魅力 2022-11-08 15:34:08
我有以下結(jié)構(gòu):type testCase struct {   input   string   isValid bool}我想在多個(gè)測(cè)試中使用這個(gè)結(jié)構(gòu),輸入可以是 astring或 anint等。我可以在處理時(shí)將int輸入轉(zhuǎn)換為string并將其轉(zhuǎn)換回int,或者我可以定義兩個(gè)不同的結(jié)構(gòu),例如testCaseInt,testCaseStruct這將解決我的問(wèn)題,但怎么做我通過(guò)轉(zhuǎn)換input為interface?我是 Go 新手,并嘗試用谷歌搜索,但可能找不到,因?yàn)槲也恢酪阉魇裁础?
查看完整描述

4 回答

?
動(dòng)漫人物

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

如何在 Go 中聲明和使用可以同時(shí)存儲(chǔ)字符串和 int 值的變量?

你不能。Go 的類(lèi)型系統(tǒng)(從 Go 1.17 開(kāi)始)不提供 sum 類(lèi)型。

你將不得不等待 Go 1.18。


查看完整回答
反對(duì) 回復(fù) 2022-11-08
?
明月笑刀無(wú)情

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

權(quán)衡是在靜態(tài)類(lèi)型和靈活容器之間。


在 Go 1.17 之前,您不能擁有具有不同靜態(tài)類(lèi)型的結(jié)構(gòu)字段。最好的方法是interface{}, 然后在使用時(shí)斷言動(dòng)態(tài)類(lèi)型。這有效地允許您testCases在運(yùn)行時(shí)擁有任一類(lèi)型的容器。


type testCase struct {

   input   interface{}

   isValid bool

}


func main() {

    // can initialize container with either type

    cases := []testCase{{500, false}, {"foobar", true}}


    // must type-assert when using

    n := cases[0].(int)

    s := cases[1].(string)

}

使用 Go 1.18,您可以稍微提高類(lèi)型安全性,以換取更少的靈活性。


使用聯(lián)合對(duì)結(jié)構(gòu)進(jìn)行參數(shù)化。這靜態(tài)地限制了允許的類(lèi)型,但現(xiàn)在必須顯式實(shí)例化結(jié)構(gòu),因此您不能擁有具有不同實(shí)例化的容器。這可能與您的目標(biāo)兼容,也可能不兼容。

type testCase[T int | string] struct {

   input   T

   isValid bool

}


func main() {

    // must instantiate with a concrete type

    cases := []testCase[int]{

        {500, false},     // ok, field takes int value

        /*{"foobar", true}*/, // not ok, "foobar" not assignable to int

    }

    // cases is a slice of testCase with int fields

}

不,實(shí)例化testCase[any]是一個(gè)紅鯡魚(yú)。首先,any只是不滿足約束int | string;即使您放松了這一點(diǎn),它實(shí)際上也比 Go 1.17 解決方案更糟糕,因?yàn)楝F(xiàn)在您不能只testCase在函數(shù)參數(shù)中使用,而是必須使用完全testCase[any].


使用聯(lián)合參數(shù)化結(jié)構(gòu),但仍使用interface{}/any作為字段類(lèi)型:(如何)我可以在 go 中實(shí)現(xiàn)通用的“Either”類(lèi)型嗎?. 這也不允許同時(shí)擁有兩種類(lèi)型的容器。

一般來(lái)說(shuō),如果您的目標(biāo)是使用任一類(lèi)型的靈活容器類(lèi)型(切片、映射、通道),則必須將字段保持為interface{}/any并斷言使用情況。如果您只想在編譯時(shí)重用具有靜態(tài)類(lèi)型的代碼并且您使用的是 Go 1.18,請(qǐng)使用聯(lián)合約束。


查看完整回答
反對(duì) 回復(fù) 2022-11-08
?
侃侃爾雅

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

只有你能做的是,用 interface{} 改變字符串


檢查播放(它工作正常)


https://go.dev/play/p/pwSZiZp5oVx


package main


import "fmt"


type testCase struct {

    input   interface{}

    isValid bool

}


func main() {


    test1 := testCase{}

    test1.input = "STRING".  // <-------------------STRING

    fmt.Printf("input: %v \n", test1)


    test2 := testCase{}

    test2.input = 1      // <-------------------INT

    fmt.Printf("input: %v \n", test2)


}


查看完整回答
反對(duì) 回復(fù) 2022-11-08
?
守候你守候我

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

方法一:


package main


import (

    "fmt"

)


func main() {

    var a interface{}

    a = "hi"

    if valString, ok := a.(string); ok {

        fmt.Printf("String: %s", valString)

    }

    a = 1

    if valInt, ok := a.(int); ok {

        fmt.Printf("\nInteger: %d", valInt)

    }

}

方法二:


package main


import (

    "fmt"

)


func main() {

    print("hi")

    print(1)

}


func print(a interface{}) {

    switch t := a.(type) {

    case int:

        fmt.Printf("Integer: %v\n", t)

    case string:

        fmt.Printf("String: %v\n", t)

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-11-08
  • 4 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(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)