在今天的文章中,我们将看到如何在Go中创建自定义类型!
Go中的第一个自定义类型代码
我们已经看到Go可以存储许多类型的值,比如字符串,布尔值,整数等等。但有时我们需要一个更好的变量或类型的意义。
想象一下,我们有一个应该存储我们想要在这里学习的语言的程序!
在第一个例子中,我们只需创建一个类型为string的变量来保存我们的语言:
package main
import "fmt"
var language string
func main() {
language = "Java"
fmt.Println(language)
}
如果你运行这个代码,结果将是:
Java
挺容易!但是我们可以通过创建一个自定义类型来获得更有意义的变量。这个自定义类型将是一个类似字符串或整数的例子,但是用我们想要的名字。我们来看看如何创建一个名为Language的自定义类型
type Language string
注意你的自定义类型应该有一个内建类型,在这种情况下,Language类型是一个字符串。
我怎样才能使用它?
package main
import "fmt"
type Language string
func main() {
language := Language("Java")
fmt.Println(language)
}
如果你运行这个代码,结果几乎是一样的:
Java
简单,不是吗?想象一下,你应该存储一个框架,以学习属于该语言。我们来创建另一个自定义类型:
type Framework string
完整的代码可以是:
package main
import "fmt"
type Framework string
type Language string
func main() {
language := Language("Java")
framework := Framework("Spring 5")
fmt.Println("Language to learn:", language)
fmt.Println("Framework to learn:", framework)
}
后运行此代码,我们将有:
Language to learn: Java
Framework to learn: Spring 5
你可以问:
但在这种情况下使用自定义类型或内置类型有什么区别?
这种情况的区别在于语义更清晰。你正在使用语言类型,不只是一个简单的字符串,代码让你知道!
在Go中使用自定义类型
我们可以在自定义类型中进行操作。在我们的示例中,语言类型被键入为字符串,所以这个自定义类型将支持字符串支持的所有操作。
我们来看一个例子:
package main
import (
"fmt"
)
type Language string
func main() {
language := Language("Java")
fmt.Println(language)
language = language + " - Ruby"
fmt.Println(language)
}
如果你运行这个代码,你将会拥有:
Java
Java - Ruby
正如你所看到的,我们可以连接一个语言类型,因为它是一个字符串。
具有函数的自定义类型的操作
允许由自定义类型os支持的操作,因为此操作来自内置类型。
但是,一个函数,期望一个字符串,你传递给它一个自定义类型是作为一个字符串类型?
时间代码挑战:
package main
import "fmt"
type Language string
func main() {
language := Language("Java")
fmt.Println("Language:", language)
print(language)
}
func print(value string) {
fmt.Println("Value:", value)
}
听起来不错,对吧?你只是把一个语言类型,即一个字符串下的字符串,传递给一个需要一个字符串的函数。
但是,如果你运行这个代码,你将会有下面的错误:
cannot use language (type Language) as type string in argument to print
是的,我们不能这样做!如果函数期望一个字符串,那么我们应该传递一个字符串给它!
在这种情况下,您应该将自定义类型显式转换为字符串:
print(string(language))
与Go中的自定义类型进行比较
想象一下,现在我们的语言有一门课程,应该在特定的时间完成。为此,我们创建两个自定义类型来表示时间:
分钟
小时
package main
import "fmt"
type Minute int
type Hour int
func main() {
minutes := Minute(70)
hour := Hour(10)
if minutes > 60 {
fmt.Println("Minutes is greater than 60")
}
if hour
fmt.Println("Hhours is greater than 15")
}
}
如您所见,我们可以将自定义类型与其内置类型进行比较。
但是这是一个问题:即使使用相同的内置类型,您也无法在Go中比较不同的自定义类型:
我们好奇,所以让我们试试吧!
package main
import "fmt"
type Minute int
type Hour int
func main() {
minutes := Minute(70)
hour := Hour(10)
if minutes > hour {
fmt.Println("This will never be executed")
}
}
如果你运行这个代码,你会得到这个错误:
invalid operation: minutes > hour (mismatched types Minute and Hour)
Go!在下一篇文章中:第12部分 - 在Go中使用Struct,我们将看看如何在Go中使用Struct
而已!我希望对你有用!谢谢
不要忘记看到并在GitHub上分发项目!
跟随我们保持最新!\ O /
领取专属 10元无门槛券
私享最新 技术干货