Golang是静态类型语言,不能在运行期间改变变量类型。
变量
var 语句定义了一个变量的列表;跟函数的参数列表一样,类型在后面。
初始化变量
使用关键字 var 定义变量,自动初始化为零值。如果提供初始化值,可省略变量类型,由编译器自动推断。
~~~
package main
var x int
var f float32 = 1.6
var s = "abc"
func main() {
}
~~~
一次性定义多个变量。
~~~
package main
var x, y, z int
var s, n = "abc", 123
var (
a int
b float32
)
func main() {
n, s := 0x1234, "Hello, World!"
println(x, s, n)
}
~~~
输出结果:
~~~
0 Hello, World! 4660
~~~
多变量赋值时,先计算所有相关值,然后再从左到右依次赋值。
~~~
package main
import "fmt"
func main() {
data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
fmt.Println(i, data)
}
~~~
输出结果:
~~~
2 [100 1 2]
~~~
变量定义可以包含初始值,每个变量对应一个。
~~~
package main
var i, j int = 1, 2
func main() {
}
~~~
如果初始化是使用表达式,则可以省略类型;变量从初始值中获得类型。
~~~
package main
var c, python, java = true, false, "no!"
func main() {
}
~~~
短声明变量
在函数内部,可以使用更简略的 ":=" 方式定义变量。":=" 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。
~~~
package main
import (
"fmt"
)
var c, python, java = true, false, "no!"
func main() {
k := 3
c, python, java := false, true, "yes!"
fmt.Println(c, python, java, k)
//注意检查,是定义新的局部变量,还是修改全局变量。该方式容易造成错误!
}
~~~
输出结果:
~~~
false true yes! 3
~~~
函数外的每个语句都必须以关键字开始( var 、 func 、等等), ":=" 结构不能使用在函数外。
特殊只写变量 "_",用于忽略值占位。
~~~
package main
func test() (int, string) {
return 1, "abc"
}
func main() {
_, s := test()
println(s)
}
~~~
输出结果:
~~~
abc
~~~
编译器会将未使 的局部变量当做错误。
~~~
package main
var s string // 全局变量没问题。
func main() {
i := 0 // ./main.go:6:7: i declared and not used
(可使 "_ = i" 规避)
}
~~~
注意重新赋值与定义新同名变量的区别。
~~~
package main
func main() {
s := "abc"
println(&s)
s, y := "hello", 20 // 重新赋值: 与前 s 在同 层次的代码块中,且有新的变量被定义。
println(&s, y) // 通常函数多返回值 err 会被重复使用。
{
s, z := 1000, 30 // 定义新同名变量: 不在同 层次代码块。
println(&s, z)
}
}
~~~
输出结果:
~~~
0xc42003df60
0xc42003df60 20
0xc42003df58 30
~~~
Go 语言变量作用域
作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。
Go 语言中变量可以在三个地方声明:
~~~
函数内定义的变量称为局部变量
函数外定义的变量称为全局变量
函数定义中的变量称为形式参数
~~~
接下来让我们具体了解局部变量、全局变量和形式参数。
局部变量
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
以下实例中 main() 函数使用了局部变量 a, b, c:
~~~
package main
import "fmt"
func main() {
/* 声明局部变量 */
var a, b, c int
/* 初始化参数 */
a = 10
b = 20
c = a + b
fmt.Printf("结果: a = %d, b = %d and c = %d\n", a, b, c)
}
~~~
输出结果:
~~~
结果: a = 10, b = 20 and c = 30
~~~
全局变量
在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。
全局变量可以在任何函数中使用,以下实例演示了如何使用全局变量:
~~~
package main
import "fmt"
/* 声明全局变量 */
var g int
func main() {
/* 声明局部变量 */
var a, b int
/* 初始化参数 */
a = 10
b = 20
g = a + b
fmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)
}
~~~
输出结果:
~~~
结果: a = 10, b = 20 and g = 30
~~~
Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。实例如下:
~~~
package main
import "fmt"
/* 声明全局变量 */
var g int = 20
func main() {
/* 声明局部变量 */
var g int = 10
fmt.Printf("结果: g = %d\n", g)
}
~~~
输出结果:
~~~
结果: g = 10
~~~
形式参数
形式参数会作为函数的局部变量来使用。实例如下:
~~~
package main
import "fmt"
/* 声明全局变量 */
var a int = 20
func main() {
/* main 函数中声明局部变量 */
var a int = 10
var b int = 20
var c int = 0
fmt.Printf("main()函数中 a = %d\n", a)
c = sum(a, b)
fmt.Printf("main()函数中 c = %d\n", c)
}
/* 函数定义-两数相加 */
func sum(a, b int) int {
fmt.Printf("sum() 函数中 a = %d\n", a)
fmt.Printf("sum() 函数中 b = %d\n", b)
return a + b
}
~~~
输出结果:
~~~
main()函数中 a = 10
sum() 函数中 a = 10
sum() 函数中 b = 20
main()函数中 c = 30
~~~
不同类型的局部和全局变量默认值:
全局:
~~~
package main
import "fmt"
var b bool
var i int
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui uint
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
var f32 float32
var f64 float64
var s string
func main() {
fmt.Printf("全局变量: bool 默认值:%v\n", b)
fmt.Printf("全局变量: int 默认值:%v\n", i)
fmt.Printf("全局变量: int8 默认值:%v\n", i8)
fmt.Printf("全局变量: int16 默认值:%v\n", i16)
fmt.Printf("全局变量: int32 默认值:%v\n", i32)
fmt.Printf("全局变量: int64 默认值:%v\n", i64)
fmt.Printf("全局变量: int64 默认值:%v\n", i64)
fmt.Printf("全局变量: uint 默认值:%v\n", ui)
fmt.Printf("全局变量: uint8 默认值:%v\n", ui8)
fmt.Printf("全局变量: uint16 默认值:%v\n", ui16)
fmt.Printf("全局变量: uint32 默认值:%v\n", ui32)
fmt.Printf("全局变量: uint64 默认值:%v\n", ui64)
fmt.Printf("全局变量: uint64 默认值:%v\n", ui64)
fmt.Printf("全局变量: float32 默认值:%v\n", f32)
fmt.Printf("全局变量: float64 默认值:%v\n", f64)
fmt.Printf("全局变量: string 默认值:%v\n", s)
}
~~~
输出结果:
~~~
全局变量: bool 默认值:false
全局变量: int 默认值:0
全局变量: int8 默认值:0
全局变量: int16 默认值:0
全局变量: int32 默认值:0
全局变量: int64 默认值:0
全局变量: int64 默认值:0
全局变量: uint 默认值:0
全局变量: uint8 默认值:0
全局变量: uint16 默认值:0
全局变量: uint32 默认值:0
全局变量: uint64 默认值:0
全局变量: uint64 默认值:0
全局变量: float32 默认值:0
全局变量: float64 默认值:0
全局变量: string 默认值:
~~~
局部:
~~~
package main
import "fmt"
func main() {
var b bool
var i int
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui uint
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
var f32 float32
var f64 float64
var s string
fmt.Printf("局部变量: bool 默认值:%v\n", b)
fmt.Printf("局部变量: int 默认值:%v\n", i)
fmt.Printf("局部变量: int8 默认值:%v\n", i8)
fmt.Printf("局部变量: int16 默认值:%v\n", i16)
fmt.Printf("局部变量: int32 默认值:%v\n", i32)
fmt.Printf("局部变量: int64 默认值:%v\n", i64)
fmt.Printf("局部变量: int64 默认值:%v\n", i64)
fmt.Printf("局部变量: uint 默认值:%v\n", ui)
fmt.Printf("局部变量: uint8 默认值:%v\n", ui8)
fmt.Printf("局部变量: uint16 默认值:%v\n", ui16)
fmt.Printf("局部变量: uint32 默认值:%v\n", ui32)
fmt.Printf("局部变量: uint64 默认值:%v\n", ui64)
fmt.Printf("局部变量: uint64 默认值:%v\n", ui64)
fmt.Printf("局部变量: float32 默认值:%v\n", f32)
fmt.Printf("局部变量: float64 默认值:%v\n", f64)
fmt.Printf("局部变量: string 默认值:%v\n", s)
}
~~~
输出结果:
~~~
局部变量: bool 默认值:false
局部变量: int 默认值:0
局部变量: int8 默认值:0
局部变量: int16 默认值:0
局部变量: int32 默认值:0
局部变量: int64 默认值:0
局部变量: int64 默认值:0
局部变量: uint 默认值:0
局部变量: uint8 默认值:0
局部变量: uint16 默认值:0
局部变量: uint32 默认值:0
局部变量: uint64 默认值:0
局部变量: uint64 默认值:0
局部变量: float32 默认值:0
局部变量: float64 默认值:0
局部变量: string 默认值:
~~~
- 序言
- 目录
- 环境搭建
- Linux搭建golang环境
- Windows搭建golang环境
- Mac搭建golang环境
- 介绍
- 1.Go语言的主要特征
- 2.golang内置类型和函数
- 3.init函数和main函数
- 4.包
- 1.工作空间
- 2.源文件
- 3.包结构
- 4.文档
- 5.编写 Hello World
- 6.Go语言 “ _ ”(下划线)
- 7.运算符
- 8.命令
- 类型
- 1.变量
- 2.常量
- 3.基本类型
- 1.基本类型介绍
- 2.字符串String
- 3.数组Array
- 4.类型转换
- 4.引用类型
- 1.引用类型介绍
- 2.切片Slice
- 3.容器Map
- 4.管道Channel
- 5.指针
- 6.自定义类型Struct
- 编码格式转换
- 流程控制
- 1.条件语句(if)
- 2.条件语句 (switch)
- 3.条件语句 (select)
- 4.循环语句 (for)
- 5.循环语句 (range)
- 6.循环控制Goto、Break、Continue
- 函数
- 1.函数定义
- 2.参数
- 3.返回值
- 4.匿名函数
- 5.闭包、递归
- 6.延迟调用 (defer)
- 7.异常处理
- 8.单元测试
- 压力测试
- 方法
- 1.方法定义
- 2.匿名字段
- 3.方法集
- 4.表达式
- 5.自定义error
- 接口
- 1.接口定义
- 2.执行机制
- 3.接口转换
- 4.接口技巧
- 面向对象特性
- 并发
- 1.并发介绍
- 2.Goroutine
- 3.Chan
- 4.WaitGroup
- 5.Context
- 应用
- 反射reflection
- 1.获取基本类型
- 2.获取结构体
- 3.Elem反射操作基本类型
- 4.反射调用结构体方法
- 5.Elem反射操作结构体
- 6.Elem反射获取tag
- 7.应用
- json协议
- 1.结构体转json
- 2.map转json
- 3.int转json
- 4.slice转json
- 5.json反序列化为结构体
- 6.json反序列化为map
- 终端读取
- 1.键盘(控制台)输入fmt
- 2.命令行参数os.Args
- 3.命令行参数flag
- 文件操作
- 1.文件创建
- 2.文件写入
- 3.文件读取
- 4.文件删除
- 5.压缩文件读写
- 6.判断文件或文件夹是否存在
- 7.从一个文件拷贝到另一个文件
- 8.写入内容到Excel
- 9.日志(log)文件
- server服务
- 1.服务端
- 2.客户端
- 3.tcp获取网页数据
- 4.http初识-浏览器访问服务器
- 5.客户端访问服务器
- 6.访问延迟处理
- 7.form表单提交
- web模板
- 1.渲染终端
- 2.渲染浏览器
- 3.渲染存储文件
- 4.自定义io.Writer渲染
- 5.模板语法
- 时间处理
- 1.格式化
- 2.运行时间
- 3.定时器
- 锁机制
- 互斥锁
- 读写锁
- 性能比较
- sync.Map
- 原子操作
- 1.原子增(减)值
- 2.比较并交换
- 3.导入、导出、交换
- 加密解密
- 1.md5
- 2.base64
- 3.sha
- 4.hmac
- 常用算法
- 1.冒泡排序
- 2.选择排序
- 3.快速排序
- 4.插入排序
- 5.睡眠排序
- 设计模式
- 创建型模式
- 单例模式
- 抽象工厂模式
- 工厂方法模式
- 原型模式
- 结构型模式
- 适配器模式
- 桥接模式
- 合成/组合模式
- 装饰模式
- 外观模式
- 享元模式
- 代理模式
- 行为性模式
- 职责链模式
- 命令模式
- 解释器模式
- 迭代器模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 策略模式
- 模板模式
- 访问者模式
- 数据库操作
- golang操作MySQL
- 1.mysql使用
- 2.insert操作
- 3.select 操作
- 4.update 操作
- 5.delete 操作
- 6.MySQL事务
- golang操作Redis
- 1.redis介绍
- 2.golang链接redis
- 3.String类型 Set、Get操作
- 4.String 批量操作
- 5.设置过期时间
- 6.list队列操作
- 7.Hash表
- 8.Redis连接池
- golang操作ETCD
- 1.etcd介绍
- 2.链接etcd
- 3.etcd存取
- 4.etcd监听Watch
- golang操作kafka
- 1.kafka介绍
- 2.写入kafka
- 3.kafka消费
- golang操作ElasticSearch
- 1.ElasticSearch介绍
- 2.kibana介绍
- 3.写入ElasticSearch
- NSQ
- 安装
- 生产者
- 消费者
- beego框架
- 1.beego框架环境搭建
- 2.参数配置
- 1.默认参数
- 2.自定义配置
- 3.config包使用
- 3.路由设置
- 1.自动匹配
- 2.固定路由
- 3.正则路由
- 4.注解路由
- 5.namespace
- 4.多种数据格式输出
- 1.直接输出字符串
- 2.模板数据输出
- 3.json格式数据输出
- 4.xml格式数据输出
- 5.jsonp调用
- 5.模板处理
- 1.模板语法
- 2.基本函数
- 3.模板函数
- 6.请求处理
- 1.GET请求
- 2.POST请求
- 3.文件上传
- 7.表单验证
- 1.表单验证
- 2.定制错误信息
- 3.struct tag 验证
- 4.XSRF过滤
- 8.静态文件处理
- 1.layout设计
- 9.日志处理
- 1.日志处理
- 2.logs 模块
- 10.会话控制
- 1.会话控制
- 2.session 包使用
- 11.ORM 使用
- 1.链接数据库
- 2. CRUD 操作
- 3.原生 SQL 操作
- 4.构造查询
- 5.事务处理
- 6.自动建表
- 12.beego 验证码
- 1.验证码插件
- 2.验证码使用
- beego admin
- 1.admin安装
- 2.admin开发
- beego 热升级
- gin框架
- 安装使用
- 项目
- 秒杀项目
- 日志收集
- 面试题
- 面试题一
- 面试题二
- 错题集
- Go语言陷阱和常见错误
- 常见语法错误
- 初级
- 中级
- 高级
- Go高级应用
- goim
- goim 启动流程
- goim 工作流程
- goim 结构体
- gopush
- gopush工作流程
- gopush启动流程
- gopush业务流程
- gopush应用
- gopush新添功能
- rpc
- HTTP RPC
- TCP RPC
- JSON RPC
- 常见RPC开源框架
- pprof
- pprof介绍
- pprof应用
- 封装 websocket
- zookeeper
- 基本操作测试
- 简单的分布式server
- Zookeeper命令行使用
- cgo
- Go语言 demo
- 用Go语言计算一个人的年龄,生肖,星座
- 超简易Go语言实现的留言板代码
- 信号处理模块,可用于在线加载配置,配置动态加载的信号为SIGHUP
- 阳历和阴历相互转化的工具类 golang版本
- 错误总结