学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于Java,Vue,React也有一些研究。工作之余,喜欢学习和分享,希望能够通过此公众号"张大鹏520",将自己学到的东西分享给大家,和大家一起交流,一起成长,一起进步。
今天要给大家分享的是《Go语言基础01 变量》,这是一个系列的教程,从零基础到项目实战。在本教程中,我会给大家介绍Go语言中变量相关的知识。比如如果定义变量,如何定义常量,如何实现枚举,如何实现变量类型转换等。
如果大家需要本教程的PDF电子书或者完整的源码,可以在文末找到获取方式哈。
Go语言中的变量,即使你不赋值,也是有一个初始值的。
示例代码:
package main
import (
"fmt"
)
// 变量的零值
func main() {
var a int // 整数的零值是0
var s string // 字符串的零值是1
fmt.Printf("%d %q\n", a, s)
}
平时我们最常用的变量类型有整数类型,字符串类型,布尔类型和浮点类型,他们的初始值分别是:
示例代码:
package main
import "fmt"
func main() {
// 变量有自己的初始值
var (
a int
b string
c bool
d float64
)
// 查看变量的初始值
fmt.Println("整数类型的初始值是:", a)
fmt.Printf("字符串类型的初始值是:%q\n", b) // %q会给字符串加上双引号
fmt.Println("布尔类型的初始值是:", c)
fmt.Println("浮点数类型的初始值是:", d)
}
输出结果:
整数类型的初始值是: 0
字符串类型的初始值是:""
布尔类型的初始值是: false
浮点数类型的初始值是: 0
除了常用的基本数据类型,还有slice切片类型,map字典类型,struct结构体类型,interface接口类型,它们的零值分别是:
[]空切片{}空结构体nil空指针map[]空字典示例代码:
package main
import "fmt"
func main() {
// 变量有自己的初始值
var (
a []int // slice切片类型
b map[string]string // 字典类型
c struct{} // 结构体类型
d interface{} // 接口类型
)
// 查看变量的初始值
fmt.Println("slice切片类型的初始值是:", a)
fmt.Println("字典类型的初始值是:", b) // %q会给字符串加上双引号
fmt.Println("结构体类型的初始值是:", c)
fmt.Println("接口类型的初始值是:", d)
}
输出结果:
slice切片类型的初始值是: []
字典类型的初始值是: map[]
结构体类型的初始值是: {}
接口类型的初始值是: <nil>
示例代码:
package main
import "fmt"
func main() {
// 变量在定义的时候就可以给定一个值
var num int = 33
fmt.Println(num)
}
示例代码:
package main
import "fmt"
func main() {
// 可以在一行定义并赋初值
var a, b, c int = 1, 2, 3
fmt.Println(a, b, c)
}
示例代码:
package main
import "fmt"
func main() {
// 变量的类型可以省略不写,Go会根据值自动推导类型
var a = 123
fmt.Println(a)
}
即使一行有多个变量,哪怕变量的类型不相同,Go也能够自动推导。
示例代码:
package main
import "fmt"
func main() {
// 自动推导:一行的变量类型相同
var a, b, c = 1, 2, 3
fmt.Println(a, b, c)
// 自动推导:一行的变量类型不同
var aa, bb, cc = true, 1.33, "ok"
fmt.Println(aa, bb, cc)
}
变量的声明方式,除了显示声明,类型推导,如果是在函数内部的变量声明,还可以使用简写方式。
示例代码:
package main
import "fmt"
func main() {
// 简写变量
a := 11
fmt.Println(a)
}
同样地,除了支持单变量的简写,多个变量也同样支持。
示例代码:
package main
import "fmt"
func main() {
a, b, c := 11, true, "ok"
fmt.Println(a, b, c)
}
在函数外面赋值的变量,在整个包内都可以使用。如果这个变量名的首字母是大写的,那么在包外也可以通过导入来使用。
示例代码:
package main
import (
"fmt"
)
var (
// 在函数的外面赋值的变量,是全局变量
// 不是严格的全局变量,只在本包内使用
aa = 3
ss = "kkk"
bb = true
)
func main() {
fmt.Println(aa)
fmt.Println(ss)
fmt.Println(bb)
}
除了分开多行写,全局变量照样支持在一行合并声明。不过需要注意的是,全局变量并不能够支持简写方式。
示例代码:
package main
import (
"fmt"
)
var (
a, b, c = 11, true, "ok"
)
func main() {
fmt.Println(a, b, c)
}
使用const可以定义一个常量。
示例代码:
package main
import (
"fmt"
)
func main() {
const PI = 3.14159
fmt.Println(PI)
}
如果同时声明多个常量,可以使用一个const关键字合并,而不需要每个都单独使用一个const关键字。
示例代码:
package main
import (
"fmt"
)
func main() {
const (
A = 11
B = 22
C = 33
)
fmt.Println(A, B, C)
}
在Go中,使用const和iota配合,能够实现枚举类型。
示例代码:
package main
import (
"fmt"
)
func main() {
const (
A = iota // 0
B // 自动+1
C // 自动+1
)
fmt.Println(A, B, C)
}
输出结果:
0 1 2
枚举值是可以弃用的,通过给某个枚举值赋值为_进行弃用。
示例代码:
package main
import (
"fmt"
)
func main() {
const (
A = iota // 0
_ // 弃用1
_ // 弃用2
_ // 弃用3
B // 4
C // 5
)
fmt.Println(A, B, C)
}
输出结果:
0 4 5
枚举值是可以参与计算的,比如让第一个枚举值加10000,后面的枚举值都会自动自增且加上原本的10000。
示例代码:
package main
import (
"fmt"
)
func main() {
const (
SUCCESS = iota + 10000 // 10000
NOT_FOUND
ARG_ERROR
)
fmt.Println(SUCCESS)
fmt.Println(NOT_FOUND)
fmt.Println(ARG_ERROR)
}
输出结果:
10000
10001
10002
我们可以来实现一个比较有用的真实案例,使用枚举定义kb,mb,gb等计算机单位。
示例代码:
package main
import (
"fmt"
)
func main() {
const (
B = 1 << (10 * iota)
KB
MB
GB
TB
PB
)
fmt.Println(B)
fmt.Println(KB)
fmt.Println(MB)
fmt.Println(GB)
fmt.Println(TB)
fmt.Println(PB)
}
输出结果:
1
1024
1048576
1073741824
1099511627776
1125899906842624
示例代码:
package main
import (
"fmt"
)
func main() {
a := 11
b := float64(a)
fmt.Println(a, b)
}
示例代码:
package main
import (
"fmt"
)
func main() {
a := 11.11
b := int(a)
fmt.Println(a, b)
}
需求,利用勾股定理,已知两个直角边a=33,b=44,求第三边c的长度。
示例代码:
package main
import (
"fmt"
"math"
)
func main() {
a, b := 33, 44
c := int(math.Sqrt(float64(a*a) + float64(b*b)))
fmt.Println(c)
}
输出结果:
55
关注我不迷路,欢迎关注我的微信公众号"张大鹏520",如果您对此文章感兴趣,欢迎点赞收藏,留言评论。
文中所有代码,只需要打赏20元,然后留言评论“已打赏”,即可获取哦。
本文的PDF电子书版,只需要打赏3元,然后留言评论“已打赏”,即可获取哦。
写文章不容易,不喜勿喷哈,如果有想要学编程,学项目,或者在工作中有项目难以单独完成需要提供帮助的同学,欢迎私信我哈。生活不易,想要利用学到的编程知识,业余赚点零花钱。
接项目:网站开发,APP开发,各种管理系统开发。
带徒弟:Python编程教学,Golang编程教学,前端编程教学。
谢谢您!!!