package main

import (
	"fmt"
	"math"
	"math/cmplx"
)

/*此处不能使用 := 来定义变量
go 语言都中包内变量，go 没有全局变量
函数包变量可以不使用，
*/
var xx = 3
var ss = 100

/*统一定义变量*/
var (
	x1 = 23
	x2 = true
	x3 = 323.23
)

func variableZeroValue() {
	/*函数内部变量必须被使用*/
	var a int
	var s string
	fmt.Printf("%d  %q\n", a, s)
}

func variableInitialValue() {
	var a, b int = 3, 4
	var s string = "abc"
	fmt.Println(a, b, s)
}

func variableTypeDeduction() {
	var x, b, c, e, f = 3.23, 4, "abdad", true, 4.54
	fmt.Println(x, b, f+1, c, e)
}

func variableShorter() {
	/*
	   不使用 var
	   第一次定义变量可以使用:=,但是只能在函数内部使用，外部不能使用
	*/
	x, b, c, e, f := 3.23, 4, "abdad", true, 4.54
	fmt.Println(x, b, f+1, c, e)
}
func euler() {
	c := 3 + 4i
	fmt.Println(cmplx.Abs(c))
}

/*强制转换*/
func triangle() {
	a, b := 3, 5
	fmt.Println(calcTriangle(a, b))
}
func calcTriangle(a, b int) int {
	var c int
	c = int(math.Sqrt(float64(a*a + b*b)))
	return c
}

/*常量*/
func consts() {
	/*const filename="abc.txt"
	const a, b  = 3, 4 */
	/* 集中写常量*/
	const (
		filename = "abc.txt"
		a, b     = 3, 4
	)
	var c int
	c = int(math.Sqrt(a*a + b*b))
	fmt.Println(filename, c)
}

/*枚举*/
func enums() {
	/*常量定义必须给赋值*/
	const (
		cpp = iota // 自动填充递长
		java
		python
		golang
		javasscipt
		_ // 下划线跳过自动填充值
		php
	)
	const x int = 0
	fmt.Println(x, cpp, python, golang, javasscipt, java, php)

	/*设置自增表达式*/
	const (
		b = 1 << (10 * iota)
		kb
		mb
		gb
		tb
		pb
	)
	fmt.Println(b, kb, mb, gb, tb, pb)
}

func main() {
	variableZeroValue()
	variableInitialValue()
	variableTypeDeduction()
	variableShorter()
	fmt.Println(x1, x2, x3)
	euler()
	triangle()
	consts()
	enums()
}
