【Go语言】基础语法
一、Go 命名规则
变量、常量、自定义类型、包、函数的命名方式必须遵循以下规则:
1. 首字符可以是任何Unicode字符或下划线
2. 首字符以外的部分可以是Unicode字符、下划线、数字
3. 名字长度无限制
4. 不可使用关键字和保留字
5、首字母大写进行定义的常量、变量、函数、接口 可以跨packa访问
二、操作符与表达式
算术运算符
运算符 |
描述 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 求余 |
关系运算符
运算符 | 描述 |
== | 相等 |
!= <> | 不相等 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
逻辑运算符
运算符 | 描述 |
|| | OR 或 |
&& | AND 且 |
! | NOT 非 |
位运算符
运算符 | 描述 |
& |
参与运算的两数各对应的二进位相与(两位均为1才为1) |
| | 参与运算的两数各对应的二进位相或(其中一位均为1就为1) |
^ | 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1(两位不一样则为1)。作为一元运算符时表示按位取反,符号位也跟着变 |
<< | 左移n位就是乘以2的n次方。a<<b是把a的各二进位全部左移b位,高位丢弃,低位补0 |
>> | 右移n位就是除以2的n次方。a>>b是把a的各二进位全部右移b位 |
补码
位运算
赋值运算符
运算符 | 描述 |
= | 简单赋值 |
+= | 相加后赋值 |
-= | 相减后赋值 |
*= | 相乘后赋值 |
%= | 求余后赋值 |
/= | 相除后赋值 |
<<= | 左移后赋值 |
>>= | 右移后赋值 |
&= | 按位与后赋值 |
|= | 按位或后赋值 |
^= | 按位异或后赋值 |
三、变量、常量、字面量
1、变量
变量类型
类型 变量类型 fmt输出 默认初始化值 整型 int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 %d 0 浮点型 float32 float64 %f %e %g 0 复数 complex128 complex64 %v 0 布尔型 bool %t false 指针 uintptr %p %d nil 引用 map slice channel %v nil 字节(仅支持ASCII码) byte %d nil 任意字符(支持任意字符) rune %d nil 字符串 string %s '' 错误 error %v nil 变量初始化
如果声明变量后未显示初始化变量值,会赋予默认值
#变量完整声明格式 var a string = "china" #多个变量同时声明 var a,b int = 7 , 8
var ( a=7 b=8 c=9 ) #动态识别模式,声明变量 var a = "china" #动态识别模式,声明多个变量 var a,b = "china" , 7 #函数内部变量可使用 := 声明并初始化变量 func test () { a := 3 b float32 := 4 } #_可用来声明匿名变量:匿名变量不占用命名空间,不分配内存,因此可重复使用 _ = 2+4变量作用域
全局变量:
大写字母开头,所有地方都可以访问,跨package访问时需要带上package名称
小写字母开头,本package中可以访问
全局变量必须使用 var / const 进行定义,不可以使用 :=
局部变量:
仅本函数内部可以访问,内部声明的变量可以跟外部声明的变量有冲突,以内部变量为准
可以通过 {} 实现变量局部使用,仅在 {} 内生效,可以和外部变量有冲突
//在vp package 中定义全局变量 Name package vp var ( Name = "Janzen" )主程序中引用变量
package main import ( "fmt" "test/vp" ) var ( age = 27 // 设置本package使用的全局变量 Passwd = "janzen_q" // 设置可跨package使用的全局变量 Name = "Janzen.qiu" // 设置可跨package使用的全局变量 ) func new_paaswd() { // 设置函数内局部变量 Passwd Passwd := "janzen_Q" fmt.Printf("Passwd = %s\n", Passwd) } func new_age() { // 设置函数内局部变量 age age := 25 fmt.Printf("new age = %d\n", age) { // 设置作用域内局部变量 Passwd var age int = 28 fmt.Printf("set age = %d\n", age) } fmt.Printf("new age = %d\n", age) } func main() { new_age() new_paaswd() fmt.Printf("vp.Name = %s\n", vp.Name) fmt.Printf("Name = %s\n", Name) fmt.Printf("Passwd = %s\n", Passwd) fmt.Printf("age = %d\n", age) }PS F:\go\go_project\test> go run .\main.go new age = 25 set age = 28 new age = 25 Passwd = janzen_Q vp.Name = Janzen Name = Janzen.qiu Passwd = janzen_q age = 27
2、常量
常量定义
常量在定义时必须进行赋值,且程序运行期间其值不能改变
const Pl float32 = 3.14 const( PI = 3.14 E = 2.71 ) const( a = 100 b // b=100,继承上一行的值 c // c=100,继承上一行的值 )iota 递增
const( a = iota // a=0 b // b=1 c // c=2 d // d=3 e // e=4 ) const( a = iota // a=0 b // b=1 c // c=2 _ // _=3 d // d=4 ) const( a = iota // a=0 b = 30 // b=30 c // c=30 d // d=30 e // e=30 ) const( a = iota // a=0 b = 30 // b=30 c = iota // c=1 d // d=2 e // e=3 )iota 使用场景案例
const ( _ = iota KB = 1 << (10*iota) MB GB TB ) const( a,b = iota+1 , iota+2 // 1,2 iota = 0 c,d // 2,3 iota = 1 e,f // 3,4 iota = 2 )
3、字面量
字面量:没有出现变量名,直接使用值。基础类型的字面量相当于常量
fmt.Printf("%t\n",0.4 == 4) // 整型字面量 浮点型字面量 fmt.Printf("%v\n",4i) // 复数字面量 fmt.Printf("%t\n",'\uaf17' == '众') // Unicode字面量 rune字面量 fmt.Printf("%s\n", 'Hellow World !') // 整型字面量 浮点型字面量
四、注释
注释格式
- 单行注释:以 // 开头
- 多行注释:连续多行以 // 开头,或者在段前使用 /* ,段尾使用 */
- 多行注释之间不能出现空行
- NOTE:引人注意,TODO:将来需要进行优化,Deprecated:变量或函数强烈建议不再使用
- 注释行前加缩进即可写go代码
注释的位置
- 包注释:在 package xxx 上方。一个包只需要在一个地方写包注释,通常会专门写一个doc.go,里面只有一行 package xxx 和关于包的注释内容
- 结构体注释:在 type xxx struct 上方
- 函数注释:在 func xxx () 上方
- 行注释:在目标行的上方或者右侧
go doc
go 自带的文档查看工具,会自动合并对应的包注释内容,并展示可跨package调用的内容
命令格式:
go doc 目标包目录名称godoc工具
- godoc 可以为项目代码导出网页版的注释文档
- 需要先安装go get golang.org/x/tools/cmd/godoc
- 启动http:godoc -http:=6060
- 浏览器访问 http://127.0.0.1:6060/pkg/go-course/entrance_class