包声明
引入包
函数
变量
语句&表达式
注释
下面简单给出hello.go文件。
package src /*定义包名*/
import "fmt" /*引入包*/
func hello() { /*函数*/
fmt.Println("Hello,World!") /*语句&表达式*/
fmt.Println("菜鸟教程:runoob.com")
}
Go程序可以由多个标记构成。可以是关键字、标识符、常量、字符串、符号等。
数据类型用于声明函数和变量。
布尔型:布尔型的值只能是true或false。
数字类型:整型int、浮点型float32、float64、复数complex、位运算
字符串类型:字符串string
派生类型:指针类型pointer、数组类型、结构体类型struct、Channel类型、函数类型、切片类型、接口类型interface、Map类型
Go语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
声明变量的一般形式是使用 var 关键字。
// var value type
// var value1,value2 type
func main() {
var a string = "runoob"
fmt.Println(a)
var b, c int = 1, 2
fmt.Println(b,c)
}
变量声明指定变量类型,如果没有初始化,变量默认为零值。
注释:
数值类型(包括complex64/128)零值为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
根据值自行判断变量类型。
如果变量已经使用 var 声明过了,再使用 := 声明变量,产生编译错误。
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)、字符串型。
显示类型定义:const b string = "abc"
隐式类型定义:const b = "abc"
iota是特殊常量,可以认为是一个可以被编译器修改的常量。
iota在const关键字出现时将被重置为0,const中每新增一行常量声明将使iota计数一次。
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
算术运算符
假定 A 值为 10,B 值为 20。
运算符 | 描述 | 实例 |
---|---|---|
+ | 相加 | A + B 输出结果 30 |
- | 相减 | A - B 输出结果 -10 |
* | 相乘 | A * B 输出结果 200 |
/ | 相除 | B / A 输出结果 2 |
% | 求余 | B % A 输出结果 0 |
++ | 自增 | A++ 输出结果 11 |
-- | 自减 | A-- 输出结果 9 |
关系运算符
假定 A 值为 10,B 值为 20。
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个值是否相等,如果相等返回 True 否则返回 False。 | (A == B) 为 False |
!= | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 | (A != B) 为 True |
> | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 | (A > B) 为 False |
< | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 | (A < B) 为 True |
>= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 | (A >= B) 为 False |
<= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 | (A <= B) 为 True |
逻辑运算符
假定 A 值为 True,B 值为 False。
运算符 | 描述 | 实例 |
---|---|---|
&& | 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 | (A && B) 为 False |
|| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 | (A || B) 为 True |
! | 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | !(A && B) 为 True |
位运算符
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假定 A 为60,B 为13:
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 |
| | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (A | B) 结果为 61, 二进制为 0011 1101 |
^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 |
<< | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 |
>> | 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 | A >> 2 结果为 15 ,二进制为 0000 1111 |
赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 | C = A + B 将 A + B 表达式结果赋值给 C |
+= | 相加后再赋值 | C += A 等于 C = C + A |
-= | 相减后再赋值 | C -= A 等于 C = C - A |
*= | 相乘后再赋值 | C *= A 等于 C = C * A |
/= | 相除后再赋值 | C /= A 等于 C = C / A |
%= | 求余后再赋值 | C %= A 等于 C = C % A |
<<= | 左移后赋值 | C <<= 2 等于 C = C << 2 |
>>= | 右移后赋值 | C >>= 2 等于 C = C >> 2 |
&= | 按位与后赋值 | C &= 2 等于 C = C & 2 |
^= | 按位异或后赋值 | C ^= 2 等于 C = C ^ 2 |
|= | 按位或后赋值 | C |= 2 等于 C = C | 2 |
其他运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 返回变量存储地址 | &a; 将给出变量的实际地址。 |
* | 指针变量。 | *a; 是一个指针变量 |
条件语句通过指定一个或多个条件,并通过测试条件是否为true来决定是否执行指定语句,并在条件为false的情况下执行另外的语句。
语句 | 描述 |
---|---|
if 语句 | if 语句 由一个布尔表达式后紧跟一个或多个语句组成。 |
if...else 语句 | if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。 |
if 嵌套语句 | 你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句。 |
switch 语句 | switch 语句用于基于不同条件执行不同动作。 |
select 语句 | select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。 |
循环类型 | 描述 |
---|---|
for 循环 | 重复执行语句块 |
循环嵌套 | 在 for 循环中嵌套一个或多个 for 循环 |
控制语句 | 描述 |
---|---|
break 语句 | 经常用于中断当前 for 循环或跳出 switch 语句 |
continue 语句 | 跳过当前循环的剩余语句,然后继续进行下一轮循环。 |
goto 语句 | 将控制转移到被标记的语句。 |
无限循环:如果循环中条件语句永远不为false则会进行无限循环。
Go语言函数定义格式如下:
func function_name([parameter list]) [return_types] {
函数体
}
function_name:函数名称
parameter list:参数列表,指定参数类型、顺序、参数个数。参数可选。
return_types:返回类型,函数返回一列值。
函数体:函数定义的代码集合。
func min(num1,num2 int) int {
var result int
if (num1 > num2) {
result = num2
}else{
result = num1
}
return result
}
函数调用
package main
import "fmt"
func main() {
var a int = 100
var b int = 90
var res int
res = min(a,b)
fmt.printf("最小值为: %d\n",res)
}
调用函数可通过两种方式来传递形参。
值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
函数内定义的变量称为局部变量,作用域只在函数体内,参数和返回值变量也是局部变量。
函数外定义的变量称为全局变量,可在任何函数中使用。
函数定义中的变量称为形式参数,会作为函数的局部变量来使用。
声明数组语法格式:
var arrayname [size]dataType
arrayname是数组的名称,size是数组的大小,dataType是数组中元素的数据类型。
声明指针格式:
var var_name *var_type
var_name为指针变量名,var_type为指针类型,*号用于指定变量是作为一个指针。
var num *int /*指向整型*/
var fp *float32 /*指向浮点型*/
type struct_variable_type struct {
member definition
member definition
...
member definition
}
type Books struct {
title string
author string
subject string
book_id int
}
访问结构体成员,需使用 . 点号操作符,格式为:结构体.成员名
结构体指针格式:
var struct_pointer *Books
使用make()函数来创建切片
var slice1 []type = make([]type, len)
或
slice1 := make([]type, len)
len():获取长度
cap():计算容量
append():向切片追加新元素
copy():拷贝切片
range关键字用于for循环中迭代数组array、切片slice、通道channel、集合map的元素。在数组和切片中返回元素的索引和索引对应的值,在集合中返回key-value对。
for key,value := range oldMap {
newMap[key] = value
}
/*如果只想读取key*/
for key := range oldMap
或
for key,_ := range oldMap
/*如果只想读取value*/
for _,value := range oldMap
Map是一种无序的键值对的集合。在获取Map值时,如果键不存在,返回该类型的零值。
/*使用make函数或map关键字来定义Map*/
map_variable := make(map[KeyType]ValueType, initialCapacity)
// 创建一个初始容量为10的Map
m := make(map[string]int,10)
m := map[string]int{
"apple":1,
"banana":2,
"orange":3,
}