亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何聲明和使用可以存儲字符串和 int 值的結構字段?

如何聲明和使用可以存儲字符串和 int 值的結構字段?

Go
楊魅力 2022-11-08 15:34:08
我有以下結構:type testCase struct {   input   string   isValid bool}我想在多個測試中使用這個結構,輸入可以是 astring或 anint等。我可以在處理時將int輸入轉換為string并將其轉換回int,或者我可以定義兩個不同的結構,例如testCaseInt,testCaseStruct這將解決我的問題,但怎么做我通過轉換input為interface?我是 Go 新手,并嘗試用谷歌搜索,但可能找不到,因為我不知道要搜索什么。
查看完整描述

4 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

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

你不能。Go 的類型系統(從 Go 1.17 開始)不提供 sum 類型。

你將不得不等待 Go 1.18。


查看完整回答
反對 回復 2022-11-08
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

權衡是在靜態類型和靈活容器之間。


在 Go 1.17 之前,您不能擁有具有不同靜態類型的結構字段。最好的方法是interface{}, 然后在使用時斷言動態類型。這有效地允許您testCases在運行時擁有任一類型的容器。


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,您可以稍微提高類型安全性,以換取更少的靈活性。


使用聯合對結構進行參數化。這靜態地限制了允許的類型,但現在必須顯式實例化結構,因此您不能擁有具有不同實例化的容器。這可能與您的目標兼容,也可能不兼容。

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

}

不,實例化testCase[any]是一個紅鯡魚。首先,any只是不滿足約束int | string;即使您放松了這一點,它實際上也比 Go 1.17 解決方案更糟糕,因為現在您不能只testCase在函數參數中使用,而是必須使用完全testCase[any].


使用聯合參數化結構,但仍使用interface{}/any作為字段類型:(如何)我可以在 go 中實現通用的“Either”類型嗎?. 這也不允許同時擁有兩種類型的容器。

一般來說,如果您的目標是使用任一類型的靈活容器類型(切片、映射、通道),則必須將字段保持為interface{}/any并斷言使用情況。如果您只想在編譯時重用具有靜態類型的代碼并且您使用的是 Go 1.18,請使用聯合約束。


查看完整回答
反對 回復 2022-11-08
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

只有你能做的是,用 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)


}


查看完整回答
反對 回復 2022-11-08
?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

方法一:


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)

    }

}


查看完整回答
反對 回復 2022-11-08
  • 4 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號