变量定义

  • 使用var关键字
  • var a,b,c = 1,2,3
  • 可以放在包内也可以在函数内
  • 使用var()集中定义变量
  • 编译器可以自动推导出类型
  • 使用 := 可以写的短一些
package main

import "fmt"

//变量可以定义在包内,也可以定义在函数内
var (
	cc, dd = "hello", "world"
)

func main() {
	fmt.Println(cc, dd)
	variableZeroValue()
	variableInitialValue()
	variableTypeDeduction()
	variableShorter()
}

//变量可以赋初始值
func variableInitialValue() {
	var a, b int = 3, 4
	var c string = "initial"
	fmt.Println(a, b, c)
}

//变量类型可以被推导出来,如果没有显式的指定变量类型,Go会根据初始化值的类型推导出变量的类型。
func variableTypeDeduction() {
	var a, b, c = 3, 4, "foo"
	fmt.Println(a, b, c)
}

//变量可以省略 var来申明 :=
func variableShorter() {
	a, b, c := 3, 4, "foo"
	fmt.Println(a, b, c)
}

// 变量有默认值
func variableZeroValue() {
	var a int
	var s string
	fmt.Printf("%d %q\n", a, s)
}

内建变量类型

  • bool, string
  • (u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr // 加u就是无符合整数,不加u就是有符号整数
  • byte, rune (就是其他语言的char类型,32位)
  • float32, float64, complex64, complex128 ; //complex 复数
//验证欧拉公式
func euler() {
	fmt.Printf("%.3f/n", cmplx.Exp(1i*math.Pi)+1)
}

img

强制类型转换

  • 类型转换是强制的,没有隐形类型转换
func triangle() {
	var a, b int = 3, 4
	var c int
	fmt.Println("value of c is", c)
	c = int(math.Sqrt(float64(a*a + b*b)))
	fmt.Println(c)
}

img

常量的定义

  • const filename = "abc.text"
  • const 数值可以做各种类型使用
//定义常量
func consts() {
	const (
		filename = "abc.txt"
		a, b     = 3, 4
	)
	var c int
	c = int(math.Sqrt(a*a + b*b))
	fmt.Println(filename, c)
}
//枚举类型的定义,iota是自增值
func enums() {
    //普通枚举定义
	const (
		cpp = iota
		_
		python
		golang
		javascript
	)
    //
	const (
		b = 1 << (10 * iota)
		kb
		mb
		gb
		tb
		pb
	)
	fmt.Println(cpp, javascript, python, golang)
	fmt.Println(b, kb, mb, gb, tb, pb)
}

变量定义的要点

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

程序结构

if语句

  • if的条件可以赋值
  • if的条件里赋值的变量作用域就在这个if语句里
import (
	"fmt"
	"io/ioutil"
)

func main() {
	const filename = "abc.txt"
	if contents, err := ioutil.ReadFile(filename); err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("%s\n", contents)
	}
}

switch语句

  • switch会自动break,除非使用fallthrough
  • switch可以直接switch多个条件
//panic()当不符合条件的时候终止执行,会报错
//switch后面可以没有表达式
func grade(score int) string {
	g := ""
	switch {
	case score < 0 || score > 100:
		panic(fmt.Sprintf("Wrong score: %d", score))
	case score < 60:
		g = "F"
	case score < 80:
		g = "C"
	case score < 90:
		g = "B"
	case score <= 100:
		g = "A"
	}
	return g
}

for语句

  • for的条件不需要括号
  • for的条件可以省略初始条件,结束条件,递增表达式
  • 没有while
//for 省略起始条件,相当于 while
func convertToBin(n int) string {
	result := ""
	for ; n > 0; n /= 2 {
		lsb := n % 2
		result = fmt.Sprintf("%d%s", lsb, result)
	}
	return result
}

// for 省略递增条件
func printFile(filename string) {
	file, err := os.Open(filename)
	if err != nil {
		panic(err)
	}

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}

}

//for 省略结束条件,无限循环
func forever() {
	for {
		fmt.Println("abc")
	}
}