# 基本语法
* * * * *
--: 作者:jsh
时间:2018年8月30日
* * * * *
### 常量
常量使用关键字 const 定义,用于**存储不会改变的数据**。
存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
~~~
const PI = 3.1415926
~~~
在 Go 语言中,你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。
* 显式类型定义: const b string = "abc"
* 隐式类型定义: const b = "abc"
常量的值必须是能够在编译时就能够确定的;你可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。
* 正确的做法:const c1 = 2/3
* 错误的做法:const c2 = cc() // const initializer cc() is not a constant
**因为在编译期间自定义函数均属于未知,因此无法用于常量的赋值,但内置函数可以使用,如:len()。**
当常量定义多个,可以定义一个常量组。例如:
~~~
const (
a = "123"
b = 456
c = len(demo)
)
~~~
### 变量
声明变量的一般形式是使用 var 关键字:var identifier type。
~~~
var a int
var b boolean
var c string
~~~
声明变量组
~~~
var (
a int
b boolean
c string
)
~~~
当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil。记住,所有的内存在 Go 中都是经过初始化的。
变量的命名规则遵循骆驼命名法,即首个单词小写,每个新单词的首字母大写,例如:numShips 和 startDate。但如果你的全局变量希望能够被外部包所使用,则需要将首个单词的首字母也大写
变量作用域:一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。如果一个变量在函数体外声明,则被认为是全局变量,可以在整个包甚至外部包(被导出后)使用,不管你声明在哪个源文件里或在哪个源文件里调用该变量。
Go语言中,使用大小写来决定常量、变量、类型、接口、结构体或函数,是否可以被外部包所调用
根据约定:
* 函数名首字母 小写即为private
* 函数名首字母
变量赋值
~~~
var a int // 声明变量
func main() {
a = 10 // 变量赋值
}
~~~
### 选择结构
思考:三种结构?
Go语言中if....else....语法如下:
~~~
if 表达式 {
条件成立---输出
} else {
条件不成立--输出
}
~~~
~~~
// 流程控制
a := 10
if a := 1; a < 2 {
fmt.Println(a) // 变量作用域 考虑此时变量会输出多少
}
~~~
switch.......case......使用
~~~
func chose(i int) (y string){
switch i {
case 1:
return "a"
case 2:
return "a"
case 3:
return "b"
fallthrough
default:
return "c"
}
}
~~~
fallthrough作用 :指定fallthrough 是继续检查sencond
Go语言提供了标签的使用
标签的名称是大小写敏感的,为了提升可读性,一般建议使用全部大写字母
~~~
LABEL1:
for {
for i := 0; i <= 10; i++ {
a++
fmt.Println(a)
break LABEL1
}
}
~~~
~~~
LABEL1:
for {
for i := 0; i <= 10; i++ {
a++
fmt.Println(a)
go to LABEL1
}
}
~~~
### 循环结构
Go语言与其它语言一样,也提供了for的使用
~~~
for 初始化语句; 条件语句; 修饰语句 {}
~~~
~~~
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Printf("This is the %d iteration\n", i)
}
}
~~~
无限循环
~~~
for {
for i := 0; i <= 10; i++ {
a++
fmt.Println(a)
break LABEL1
}
}
~~~
for...range循环
~~~
m1 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
m2 := make(map[string]int)
for k, v := range m1 {
m2[v] = k
}
~~~
循环结构学会了吧,那就写一个乘法口诀表吧!!!
break和continue
~~~
for {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
if i < 0 {
break
}
}
~~~
因此每次迭代都会对条件进行检查(i < 0),以此判断是否需要停止循环。如果退出条件满足,则使用 break 语句退出循环。
思考:以下程序输出什么:
~~~
func main() {
for i:=0; i<3; i++ {
for j:=0; j<10; j++ {
if j>5 {
break
}
print(j)
}
print(" ")
}
}
~~~
一个 break 的作用范围为该语句出现后的最内部的结构,它可以被用于任何形式的 for 循环(计数器、条件判断等)。但在 switch 语句中,break 语句的作用结果是跳过整个代码块,执行后续的代码。
~~~
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
print(i)
print(" ")
}
}
~~~
关键字 continue 忽略剩余的循环体而直接进入下一次循环的过程,但不是无条件执行下一次循环,执行之前依旧需要满足循环的判断条件。
课后作业:
请输出:
~~~
*
***
*****
*******
*********
*******
*****
***
*
~~~