声明新类型

  • 关键字 type 可以用来声明新类型:
    • type celsius float64
    • var temperature celsius = 20
  • 虽然 Celsius 是一种全新的类型,但是由于它和 float64 具有相同的行为和表示,所以赋值操作能顺利执行。
  • 例如加法等运算,也可以像 float64 那样使用。
  1. package main
  2. func main() {
  3. type celsius float64
  4. const degrees = 20
  5. var temperature celsius = degrees
  6. temperature += 10
  7. }
  • 为什么要声明新类型:极大的提高代码可读性和可靠性
  • 不同的类型是无法混用的

通过方法添加行为

  • 在 C#、Java 里,方法属于类
  • 在 Go 里,它提供了方法,但是没提供类和对象
  • Go 比其他语言的方法要灵活
  • 可以将方法与同包中声明的任何类型
    相关联,但不可以是 int、float64 等预
    声明的类型进行关联。

方法 - 图1

  • 上例中,celsius 方法虽然没有参数。但它前面却有一个类型参数的接收者。
  • 每个方法可以有多个参数,但只能有一个接收者。
  • 在方法体中,接收者的行为和其它参数一样。
  • 方法声明图解:

方法 - 图2

方法调用

  • 变量 . 方法()

作业题

  • 编写一个程序:
    • 它包含三种类型:celsius、fahrenheit、kelvin
    • 3 种温度类型之间转换的方法
  1. package main
  2. import "fmt"
  3. type celsius float64
  4. func (c celsius) fahrenheit() fahrenheit {
  5. return fahrenheit((c * 9.0 / 5.0) + 32.0)
  6. }
  7. func (c celsius) kelvin() kelvin {
  8. return kelvin(c + 273.15)
  9. }
  10. type fahrenheit float64
  11. func (f fahrenheit) celsius() celsius {
  12. return celsius((f - 32.0) * 5.0 / 9.0)
  13. }
  14. func (f fahrenheit) kelvin() kelvin {
  15. return f.celsius().kelvin()
  16. }
  17. type kelvin float64
  18. func (k kelvin) celsius() celsius {
  19. return celsius(k - 273.15)
  20. }
  21. func (k kelvin) fahrenheit() fahrenheit {
  22. return k.celsius().fahrenheit()
  23. }
  24. func main() {
  25. var k kelvin = 200.0
  26. c := k.celsius()
  27. fmt.Print(k, "º K is ", c, "º C")
  28. }