目录
一、变量
1、语法:var 变量名称 变量类型
var str string = "pfei"
var a, b int = 1, 2
var mark bool // 默认false
2、如果定义变量的时候没有进行初始化,会使用默认初始值
数值类型 0
布尔类型 false
字符串 “”
以下类型为nil:
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口
3、初始化声明 :=,下面两个方式是等价的
var f string = "pfei"
f := "pfei"
4、因式分解关键字写法(一般用于全局变量)
var(
a int
b bool
c float
)
局部变量一旦被声明必须被使用,但是全局变量可以不被使用。
二、常量
在程序运行的时候不会被修改的量。
1、语法:const 常量名称 常量类型
// 显式定义
const s string = "pfei"
// 隐式定义
const s = "pfei"
//用于枚举
const (
unknown = 0
female = 1
male = 2
)
2、特殊的常量iota
可以被编译器修改的常量,iota在const关键字出现的时候被重置为0(const内部的第一行之前)const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
用法(1) 枚举值
const(
a = itoa
b
c
)
// 输出为
0 1 2
用法(2)
const(
a = itoa
b
c
d = "pfei"
e
f = 100
g
h = itoa
i
)
// 输出结果为
0
1
2
pfei
pfei
100
100
7
8
用法(3)
const(
i=1<<iota
j=3<<iota // 3左移一位
k // 3左移两位
l // 3左移三位
)
// 输出结果
1
6
12
24
注意:当变量没有给值的时候就用上一个变量使用的值,然后运算的时候iota常量会自加1。
三、运算符
1、算数运算符
+、-、*、/、%、++、--
2、关系运算符
==、!=、>、<、>=、<=
3、逻辑运算符
&&、||、!
4、位运算符
&、|、^(异或)、<<、>>
5、运算符也可以像C++一样用于赋值符号的左侧,表示先运算再赋值,例如:*=、<<=、&=
6、其他运算符
& 返回变量地址
* 指针变量
四、基本逻辑语句
1、条件语句
- if
- if...else
- if嵌套
- switch
- select
样例:
// if
if 布尔表达式{
...
}
// if...else,注意此处else的位置,放到其他地方报错
if 布尔表达式{
...
}else{
...
)
//switch
switch var0{
case var1:
...
case var2:
...
default:
...
}
// type switch
switch i := x.(type) {
case nil:
fmt.Printf(" x 的类型 :%T",i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型" )
default:
fmt.Printf("未知型")
}
// 通过fallthrough语句来强制执行下一个case
var v bool = false
switch v{
case false:
fmt.Println("1、case 条件语句为 false")
fallthrough
case true:
fmt.Println("2、case 条件语句为 true")
fallthrough
case false:
fmt.Println("3、case 条件语句为 false")
fallthrough
case true:
fmt.Println("4、case 条件语句为 true")
case false:
fmt.Println("5、case 条件语句为 false")
fallthrough
default:
fmt.Println("6、默认 case")
}
// select后补
2、循环语句
- for i := 0; i <= 10; i++
- for // 无限循环
- for i, x := range numbers
样例:
numbers := [6]int {1, 2, 3, 5}
for i, x := range numbers{
fmt.Println("第%d位x的值=%d\n", i, x)
}
goto语句
var a int = 10
/* 循环 */
LOOP: for a < 20 {
if a == 15 {
/* 跳过迭代 */
a = a + 1
goto LOOP
}
fmt.Printf("a的值为 : %d\n", a)
a++
}
五、函数
1、语法
func 函数名称(参数列表) 返回值类型{
...
}
2、和C++的不同之处
- 返回值类型写在后面,而不是函数名之前(创新点???)
- GO函数可以返回多个返回值
3、注意点
- 值传递:不影响实际参数
- 引用传递:func swap(a *int, b *int){}
4、闭包
// 注意此处ff是一个匿名函数,所以每次调用会自加一次1
func add() func() int{
var i int = 0
return func() int{
i += 1
return i
}
}
func main(){
ff := add()
fmt.Println(ff())
fmt.Println(ff())
}
5、方法
方法:就是结构体或者类中实现功能的函数,java中就只有函数
函数:实现某些功能,不用放到类或者结构体中
定义语法:func (变量名 变量类型) 函数名(参数) 返回值类型 {}
package main
import (
"fmt"
)
/* 定义结构体 */
type Circle struct {
radius float64
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
func main() {
var c1 Circle
c1.radius = 10.00
fmt.Println("圆的面积 = ", c1.getArea())
}