package main

import "fmt"

// const作为枚举使用
const (
   BEIJING  = 1
   SHANGHAI = 2
   SHENZHEN = 3
)

/*
iota is a predeclared identifier representing the untyped integer ordinal
number of the current const specification in a (usually parenthesized)
const declaration. It is zero-indexed.
*/
const (
   BeijingOne = 10 * iota // Untyped int.
   ShanghaiTwo
   ShenzhenThree
)

func main() {

   // 1.变量的声明 关键字 变量名 数据类型 变量值(没有值的时候默认是数据类型的零值)
   var num int
   // 打印num的值
   fmt.Println("num = ", num) // num =  0
   // 打印num的数据类型 Printf(格式化输出)
   fmt.Printf("num的类型:%T\n", num) // num的类型:int

   // 2.声明变量并赋初始值
   var numOne int = 10
   fmt.Printf("numOne=%d,numOne的类型是:%T\n", numOne, numOne) // numOne=10,numOne的类型是:int

   // 3.不使用数据类型赋值(Go语言自动匹配类型)
   var numTow = 20
   fmt.Printf("numTow=%d,numTow的类型是:%T\n", numTow, numTow) // numTow=20,numTow的类型是:int

   var str = "walyx.cn"
   fmt.Printf("str=%s,str的类型是:%T\n", str, str) // str=walyx.cn,str的类型是:string

   // 4.短声明 变量名 := 变量值
   numThree := 30
   fmt.Printf("numThree=%d,numThree的类型是:%T\n", numThree, numThree) // numTow=30,numTow的类型是:int

   strOne := "walyx.cn"
   fmt.Printf("strOne=%s,strOne的类型是:%T\n", strOne, strOne) // strOne=walyx.cn,strOne的类型是:string

   // 5.多变量声明
   var numFour, numFive = 40, 50
   fmt.Printf("numFour=%d,numFive=%d\n", numFour, numFive) // numFour=40,numFive=50

   var numSix, strThree = 60, "walyx.cn"
   fmt.Printf("numSix=%d,strThree=%s\n", numSix, strThree) // numSix=60,strThree=walyx.cn

   var (
      name   = "sunny"
      weChat = 1987186894
   )
   fmt.Printf("name=%s,weChat=%d\n", name, weChat) // name=sunny,weChat=1987186894

   // 常量的声明方式 关键字 变量名
   const APP_URL = "walyx.cn"

   // Cannot assign to APP_URL 报错常量一旦声明不允许改变
   // APP_URL = "www.walyx.cn"
   fmt.Println("APP_URL=", APP_URL) // APP_URL= walyx.cn

   // const作为枚举使用
   fmt.Println("BEIJING=", BEIJING)   // BEIJING= 1
   fmt.Println("SHANGHAI=", SHANGHAI) // SHANGHAI= 2
   fmt.Println("SHENZHEN=", SHENZHEN) // SHENZHEN= 3

   // iota 常量计数器 (步长计算)
   fmt.Println("BEIJING_ONE=", BeijingOne)       // BEIJING_ONE= 0
   fmt.Println("SHANGHAI_TWO=", ShanghaiTwo)     // SHANGHAI_TWO= 10
   fmt.Println("SHENZHEN_THREE=", ShenzhenThree) // SHENZHEN_THREE= 20

}