package main

import "fmt"

// 一个类型声明语句创建了一个新的类型名称，和现有类型具有相同的底层结构。
// 新命名的类型提供了一个方法，用来分隔不同概念的类型，这样即使它们底层类型相同也是不兼容的。
// type 类型名字 底层类型

type Type1 int

// 类型声明语句一般出现在包一级，因此如果新创建的类型名字的首字符大写、
// 则在包外部也是可以使用的

// Celsius
// 声明了两种类型, Celsius 和 Fahrenheit 分别对应不同的温度单位，
// 他们虽然底层同属float64， 但是他们属于不同的数据类型。
// 因此它们不可以被相互比较或混在一个表达式运算。
// 需要一个Celsius(T) 和 Fahrenheit(T)来显式的转换类型
// 注意： 可能会导致精度丢失
type Celsius float64    // 摄氏温度
type Fahrenheit float64 // 华氏温度

const (
	AbsoluteZeroC Celsius = -273.15 // 绝对零度
	FreezingC     Celsius = 0       // 结冰点温度
	BoilingC      Celsius = 100     // 沸水温度
)

func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) }

func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }

func main() {

	fmt.Printf("%g\n", BoilingC-FreezingC) // "100" °C
	boilingF := CToF(BoilingC)
	fmt.Printf("%g\n", boilingF-CToF(FreezingC)) // "180" °F

	//fmt.Printf("%g\n", boilingF-FreezingC)
	//错误，类型不匹配 compile error: type mismatch

}
