变量定义要点:

  1. 变量类型写在变量名之后
  2. 编译器可推测变量类型
  3. 没有char,只有rune
  4. 原生支持复数类型

内建变量类型:

  1. bool, string
  2. (u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr(指针)
  3. byte, rune(就是char类型,为了应付多语言的一字节来设计,32位,与int32可混用)
  4. float32, float64, complex64, complex128(表示实数,128表示实部和虚部分别是64位)
basic.go:
package main

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

// 函数外不能用":"代替var,这里变量叫做包内变量,go语言没有全局变量
var aa = 3
var ss = "kkk"
var bb = true

// 变量声明后就有初始值,Println打印不出string的初始空值,可以用Printf
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)
}

// 也可以让编译器自动决定类型,类似于cpp中auto的类型推断。这时候不同类型的变量可以在同一行中定义
func variableTypeDeduction() {
    var a, b, c, s = 3, 4, true, "def"
    fmt.Println(a, b, c, s)
}

// ":="的用法是第一次定义变量替代var和类型,只能在函数内使用
func variableShorter()  {
    a, b, c, s := 3, 4, true, "def"
    b = 5
    fmt.Println(a, b, c, s)
}

// 负数和欧拉公式 e^iπ+1=0
func euler()  {
    c := 3 + 4i
    fmt.Println(cmplx.Abs(c))

    fmt.Println(cmplx.Pow(math.E, 1i * math.Pi) + 1)
    fmt.Println(cmplx.Exp(1i*math.Pi) + 1)
    fmt.Printf("%.3f\n", cmplx.Exp(1i*math.Pi) + 1)
}

// 类型转换是强制的:go中只有强制类型转换,没有隐式类型转换
func triangle()  {
    var a, b int = 3, 4
    var c int
    c = int(math.Sqrt(float64(a * a + b * b)))
    fmt.Println(c)
}

// 常量的定义,const数值可作为各种类型使用。注意go语言中的大小写有特殊含义,所以常量名最好不要大写
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 = 0
    //  java = 1
    //  python = 2
    //  golang = 3
    //)

    // iota自增值种子
    const (
        cpp = iota
        _
        java
        python
        golang
    )
    fmt.Println(cpp, java, python, golang)

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

func main() {
    fmt.Println("hello world")
    variableZeroValue()
    variableInitialValue()
    variableTypeDeduction()
    variableShorter()
    fmt.Println(aa, ss, bb)

    fmt.Println()
    euler()

    fmt.Println()
    triangle()

    fmt.Println()
    consts()

    fmt.Println()
    enums()
}

输出:

hello world
0 ""
3 4 abc
3 4 true def
3 5 true def
3 kkk true

5
(0+1.2246467991473515e-16i)
(0+1.2246467991473515e-16i)
(0.000+0.000i)

5

abc.txt 5

0 2 3 4
1 1024 1048576 1073741824 1099511627776 1125899906842624