4 回答

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。

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)合約束。

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)
}

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)
}
}
- 4 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報(bào)