考虑这个代码:
package main
import "fmt"
type specialString string
func printString(s string) {
fmt.Println(s)
}
// unlike, say, C++, this is not legal GO, because it redeclares printString
//func printString(s specialString) {
// fmt.Println("Special: " + s)
//}
func main() {
ss := specialString("cheese")
// ... so then why shouldn't this be allowed?
printString(ss)
}
我的问题是:为什么语言被定义为不允许调用printString(ss)in main()?(我不是在寻找指向 Golang 赋值规则的答案;我已经阅读了它们,并且我看到 specialString 和 string 都具有相同的“底层类型”并且两种类型都是“命名的”——如果你考虑要命名的泛型类型“字符串”,Golang 显然是这样做的——因此它们在规则下不可分配。)
但是为什么会有这样的规则呢?通过将内置类型视为“命名”类型并阻止您将命名类型传递给所有接受相同底层内置类型的标准库函数,解决了什么问题?有人知道这里的语言设计者是怎么想的吗?
从我的角度来看,它似乎在代码中创建了很多毫无意义的类型转换,并且不鼓励在真正有意义的地方使用强类型。
慕斯王
PIPIONE
相关分类