Go语言入门基础

55

Go语言入门基础

author: histonevon@zohomail.com

date: 2020/08/04


1.源文件

 package main
 ​
 import (
     "fmt"
 )
 ​
 func main() {
     fmt.Println("Hello World!")
 }

HelloWorld

  1. package声明所属包名称

    注意 一般所属包名称与所在目录名相同,main函数包名一定是main

     package main //声明所属包名称,一般所属包名称与所在目录名相同,main函数包名一定是main
  2. import导入标准库或第三方包

    单行导入多行导入两种方式

     //单行导入
     import "pkg1"
     import "pkg2"
     //多行导入
     import (
         "fmt" //导入标准库,也可导入第三方包
         "math"
         "time"
         "eqdis/input" //eqdis为自定义工程文件名,input为自定义包名
     ) //使用小括号,各项之间没有逗号

    在LiteIDE里单行导入多个包时会被自动合并为多行导入格式

  3. 入口函数main函数

    • 入口函数main没有参数和返回值,如果要通过shell向main传入参数,可在os.Arg变量中保存

    • main函数必须放在main包中

    • 注意 Go语言中左大括号 ” { “ 必须和函数声明或控制结构在同一行

    • 注意 Go语句后分号可以省略,出现分号的典型位置是for循环等处

     func main() {
         fmt.Println("Hello World!")       //直接输出
         fmt.Printf("%d+%d=%d\n", 1, 1, 2) //格式化输出
     }

    HelloWorld

2.变量

  • 存在以下几种声明方式

 var sum int           //简单声明,默认初值为0,避免意外
 var total int = 42    //声明并初始化
 var label = "name"    //类型推断,不需要程序员敲进去类型,此处推断为string类型
 tag := "My"           //短变量+类型推断,用于函数内部,不能作为全局变量
 var c, d int = 35, 85 //可多变量一同赋值
 var a,b *int          //a,b均为int型指针
  • Go语言特色

    • 类型跟在变量名后面

    • 可以类型推断,节省程序员工作

    • 短变量声明,短变量符号 ” := “注意 短变量仅用于函数内部,不能声明全局变量)

    • 多变量同时赋值

3.if语句

 func main() {
     a := 3
     b := 4
     max := 0
     if a > b {
         max = a
     } else {
         max = b
     }
     fmt.Println(max)
 }

if

  • 条件表达式无需括起来

  • if和else对应的语句块的大括号不能省略,哪怕只有一条语句

  • 左大括号和if/else等控制结构在同一行

  • else不能单独成行,必须和if的右大括号一起

  • if后可以添加特征值获取语句,与特征值判断用分号隔开,这是golang用 ” ; “ 的地方之一

来看一个例子

 func main() {
     a := 3
     b := 4
     flag := min(b, a) //此处获取特征值,flag在上下文中都可取
     if flag == 3 {
         fmt.Println("hello")
     } else {
         fmt.Println("world")
     }
 }
 ​
 func min(a, b int) int {
     var min int
     if a < b {
         min = a
     } else {
         min = b
     }
     return min
 }

上述main函数可以写成

func main() {
	a := 3
	b := 4
    //可以添加特征值获取语句,与特征值判断用分号隔开,这是golang用;的地方之一
	if flag := min(b, a); flag == 3 {//此处flag特征值仅可用于条件快内
		fmt.Println("hello")
	} else {
		fmt.Println("world")
	}
}

运行结果均如下

if

如果存在第三个分支可以这样

if condition1 {
    // do something
} else if condition2 {
    // do something else
}else {
    // catch-all or default
}

4.分支语句

func main() {
	var result int
	var condition byte = 'e' //byte类型相当于C语言中的char
	switch condition {
	case 'a', 'b':
		result = 1
	case 'e':
		result = 2
	default:
		result = 0
	}
	fmt.Println(result)
}

switch

  • fall-through不再是默认行为,符合条件的语句执行完后无需再加break即可自动结束分支过程

  • 简化目标相同的分子条件,使用逗号分隔

  • 分支条件不限于整数和字符,任何有效的表达式都可以作为分支条件(如下)

switch result := calculate(); true {
case result < 0:
/* negative */
case result > 0:
/* positive */
default:
/* zero */
}
  • 注意 分支值如果省略,默认适配为真,及上述true可以去掉(如下)

switch result := calculate(); { //注意分号不能省略
/* ... */
}

5.循环

  • go中只有for循环

  • 循环条件不需要括起来

  • 使用方法如下

  1. 类似普通while循环

//相当于一般的while循环
func main() {
	x := 0
	for x < 5 {
		fmt.Println(x)
		x++
	}
}

for

  1. 原始的for用法

func main() {
	for x := 0; x < 5; x++ {
		fmt.Println(x)
	}
}

for2

  1. while(true)或do...while循环

func main() {
	x := 4
	for {
		fmt.Println(x)
		x--
		if x < 0 {
			break
		}
	}
}

for3

  1. for...range循环

  • 可同时返回集合中的数据的索引和值

  • range右边的表达式必须是array,slice,string,map或是指向array的指针,也可以是channel

func main() {
	x := []int{100, 101, 102}
	for i, v := range x {
		fmt.Println(i, ":", v)
	}
}

forrange

再看一个例子

func main() {
	for i, v := range "Hello 世界" {
		fmt.Printf("%d,%c\n", i, v) //%c表示Unicode字符格式输出
	}
}

forrange2

由上例可见,UTF-8中一个汉字占3B(字节)