Golang简介
Golang(又称Go语言)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 罗伯特·格瑞史莫(英语:Robert Griesemer)、罗勃·派克及肯·汤普逊于2007年9月开始设计Go,稍后伊恩·兰斯·泰勒(Ian Lance Taylor)、拉斯·考克斯(Russ Cox)加入项目。 Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,支持Linux、macOS、Windows等操作系统。
golang基础语法
一、golang标识符
1、标识符概念
Golang 对各种变量、常量、方法、函数、结构体、数组、切片、接口命名时使用的字符序列称为标识符。 凡是自己命名的位置即为标识符。
2、标识符命名规则
- 由26个英文字母大小写、数字0~9和下划线_组成
- golang中严格区分大小写
- 不能以数字开头
- 标识符不能包含空格
- 下划线在golang中是一个特殊的标识符,称为空标识符。可以代表任何其它的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)。所以仅能被作为占位符使用,不能作为标识符使用
- 不能以系统保留关键字作为标识符
| 25个保留关键字 | ||||
|---|---|---|---|---|
| break | default | func | interface | select |
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrough | if | range | type |
| continue | for | import | return | var |
二、golang变量
1、变量声明
golang中的变量需要声明以后才能使用,同一作用域内不支持重复声明,并且golang的变量声明以后必须使用。
var identifier type
var声明变量关键字
type变量类型
还可批量对变量进行声明
package main
import "fmt"
func main(){
var(
name string
id int
sex bool
)
}
2、变量初始化
golang在声明变量的时候,会自动对变量对应的内存区进行初始化,每个变量会被初始化成其他类型的默认值。
如:整型和浮点型的默认值是0;字符串默认值是空字符串"";bool类型的默认值是false;切片、函数、指针变量的默认值是nil。
var name string = "Jessie" //初始化语法
var id, sex = 23178, false //批量初始化多个变量,中间由逗号隔开
class := "1" //短变量声明,只用于函数内部
函数接收到多个变量,但一些变量在后面使用不到,可以用_表示变量名,这种变量叫匿名变量。
package main
import "fmt"
func getNameAndAge(string, int){
return "Jessie", 20
}
func main(){
name, _ := getNameAndAge()
fmt.Printf("name: %v\n", name)
}
三、golang常量
常量即为程序在编译阶段就已经确定的值,而程序运行时则无法改变该值,即一旦定义则无法修改。
在Go中常量可以为数值类型、布尔类型或者字符串类型等。
const const_name [type] = value
const常量关键字
const_name常量名
type常量类型(可忽略)
value常量初始化的值
另:用const声明多个变量时,若后面的常量为初始化,则该值等于其前面一行已给出的值。
const(
A = 1
B
C
) //A = B = C = 1
特殊关键字iota
- 被认为是一个可被编译修改的常量,其默认值为
0,每次调用时加1,遇到const关键字时被重置为0 - 同时,使用
_可以跳过某些值 - 还可声明中间插队
const(
A = iota //0
B = iota //1
C = iota //2
) //A = 1, B = 2, C = 3
const D = iota //D = 0
const(
E = iota
_
F = iota
) //E = 0, F = 2
const(
G = iota
H = 5
I = iota
) //G = 0, H = 5, I = 2
四、golang数据类型
数字类型、布尔类型、字符串类型、派生类型
1、 数字类型
Go语言支持整型和浮点型数字,并原生支持复数,其中位的运算采用补码。
Go语言中也有基于架构的类型,如int、uint和uintptr。这些类型的长度都是根据运行程序所在的操作系统类型所决定的:
-
int和uint在32位操作系统上,它们均使用32位(即4个字节);在64位操作系统上,它们均使用64位(即8个字节) -
uintptr的长度被设定为足够存放一个指针即可
注:golang没有
float类型,只有float32和float64,也没有double类型。
1.1 整型
有符号整数
int8 int16 int32 int64
无符号整数
uint8 uint16 uint32 uint64
1.2 浮点型
单精度float32可以使用一个常量定义:math.MaxFloat32
双精度float64可以使用一个常量定义:math.MaxFloat64
打印浮点数时,可以用fmt包配合动词%f。
1.3 复数
complex64和complex128
var c1 complex64
var c2 complex128
c1 = 1 + 2i
c2 = 3 + 4i
var c4 complex64
c4 = complex(1.10, 10) //该复数形式:1.10+10i
2、 布尔类型
true 和false可在if语句中作判断条件,但0和1不能表示真假
在控制循环语句和条件判断语句中可以用逻辑表达式的结果返回值为布尔类型为判断。
package main
import "fmt"
func main(){
count := 10
for i := 0;i < count; i++ { // 此处i<count返回值为bool类型
fmt.Printf("i=%v\n", i)
}
}
3、 字符串类型
golang字符字面量使用双引号""和反引号``创建。
双引号"":用于创建可解析的字符串,会识别转义字符,不用来引用多行。
反引号``:用于创建原生的字符串,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果,但不支持转义。多用于书写多行消息、HTML以及正则表达式。
package main
import "fmt"
func main(){
var str1 string = "hello world"
var html string = `
<html>
<head><title>Hello Go</title>
<html>
`
fmt.Printf("str1: %v\n", str1)
fmt.Printf("html: %v\n", html)
}
运行结果:
str1:hello world
html:
<html>
<head><title>Hello Go</title>
<html>
4、 派生类型
golang派生类型包括指针类型、数组类型、结构化类型、Channel类型、函数类型和切片类型等。
五、golang格式化输出
1、普通占位符
| 占位符 | 说明 |
|---|---|
| %v | 相应值的默认格式 |
| %+v | 打印结构体时,增加字段名 |
| %#v | 相应值的Golang语法表示 |
| %T | 相应值的类型的Golang语法表示 |
| %% | 字面上的百分号,并非值的占位符 |
2、布尔占位符
| 占位符 | 说明 |
|---|---|
| %t | true或者false |
3、整数占位符
| 占位符 | 说明 |
|---|---|
| %b | 二进制表示 |
| %c | 相应unicode码点所表示的字符 |
| %d | 十进制表示 |
| %o | 八进制表示 |
| %q | 单引号围绕的字符字面值,由Golang安全地转义 |
| %x | 十六进制表示,字母形式为小写 a-f |
| %X | 十六进制表示,字母形式为大写 A-F |
| %U | Unicode格式:U+1234,等同于 “U+%04X” |
4、指针
| 占位符 | 说明 |
|---|---|
| %p | 十六进制表示,前缀0x |
六、golang运算符
Go 语言内置的运算符有:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
1、算术运算符
+相加 -相减 *相乘 /相除 %求余
++自加和--自减只能单独成句,不能为赋值语句右边或条件判断,且只存在i++和i--,不存在++i和--i
2、关系运算符
| 运算符 | 说明 |
|---|---|
| == | 检查两个值是否相等,如果相等返回 True 否则返回 False。 |
| != | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 |
| 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 | |
| >= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 |
| < | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 |
| <= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 |
3、逻辑运算符
| 运算符 | 说明 |
|---|---|
| && | AND与运算 |
| || | OR或运算 |
| ! | NOT非运算 |
4、位运算符
| 运算符 | 说明 |
|---|---|
| & | 参与运算的两数各对应的二进位相与。 |
| | | 参与运算的两数各对应的二进位相或。 |
| ^ | 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 |
| << | 左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。 |
| >> | 右移n位就是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。 |
5、赋值运算符
| 运算符 | 说明 |
|---|---|
| = | 将右边表达式的值赋给左边 |
| 加上对应逻辑或位运算符 | 先进行逻辑或位运算再赋值 |
6、其他运算符
| 运算符 | 说明 |
|---|---|
| & | 返回变量存储地址 |
| * | 指针变量 |
7、运算符优先级
以下运算符优先级从下到上依次增高
| 分类 | 描述 | 关联性 | |
|---|---|---|---|
| 后缀 | () [] -> . ++ -- | 左到右 | |
| 单目 | + - ! ~ (type)* & sizeof | 右到左 | |
| 乘法 | * / % | 左到右 | |
| 加法 | + - | 左到右 | |
| 移位 | << >> | 左到右 | |
| 关系 | < <= > >= | 左到右 | |
| 相等 | == != | 左到右 | |
| 按位AND | & | 左到右 | |
| 按位XOR | ^ | 左到右 | |
| 按位OR | | | 左到右 | |
| 逻辑AND | && | 左到右 | |
| 逻辑OR | || | 左到右 | |
| 赋值运算符 | = += -= *= /= %= >>= <<= &= ^= | = | 右到左 |
| 逗号 | , | 左到右 |
七、总结
本笔记主要记录了golang的基本语法知识,在了解之后,对于go程序的编写能够更加清晰易上手。golang的语法非常简洁,学习曲线平缓,并且执行性能好、开发效率高,其自带的垃圾回收机制能更好地帮助在大规模开发时避免内存泄漏,帮助开发者有效节省编写代码的时间和难度。对于初学者也能够在短时间内,将其他已学编程语言的知识迁移于此,结合golang的语言特性进行项目开发。