目录:
一、数据类型
二、常量变量
二、基本逻辑
一、数据类型
对比python,我们必须意识到GoLang是一门强类型语言。
1、布尔型
在 Go 中,布尔值的类型为 bool,值是 true 或 false,默认为 false。
func main() {
var a bool
fmt.Println(a)
}
#输出
false
2、数字类型
- 整型
类型 取值范围
int8 -128到127
uint8 0到255
int16 -32768到32767
uint16 0到65535
int32 -2147483648到2147483647
uint32 0到4294967295
int64 -2^(64-1)到2^(64-1)-1
uint64 0到2^64-1
所谓无符号类型即为非负类型。
- 浮点型
float32和float64.它们的算术规范由IEEE754浮点数国际标准定义, 该浮点数规范被所有现代的CPU支持。 - 复数
complex64和complex128,分别对应float32和float64两种浮点数精度。内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部。
func main() {
var x complex64 = complex(1, 2)
var y complex64 = complex(3, 4)
fmt.Println(x*y)
fmt.Println(real(x*y))
fmt.Println(imag(x*y))
}
#输出
(-5+10i)
-5
10
- 其它
byte 与uint8等价
rune 与int32等价
uint 取值位数等于cpu位数(32/64)
int 取值位数等于cpu位数(32/64)
uintptr 无符号整型,用于存放一个指针
在go>=1.9时,对于数字类型,无需定义int及float32、float64,系统会自动识别。
尤其是int类型,在使用goland时,会直接给予“类型可忽略”的提示。
func main() {
var a =1
var b =1.3333
fmt.Println(a,b)
}
#输出
1 1.3333
讲到这里,想顺便提一下go的一个特性,严格的内存管理。在之前做白盒测试的时候,有一个低风险项:声明但未使用,严格来讲对系统并没有直接危害,但确实对内存真实的浪费。这个问题在Go这里不再纠结了,如果声明却不使用,语法检查不会通过。
func main() {
var a =1
var b =2
fmt.Println(a)
}
#输出
# command-line-arguments
b declared and not used
3、字符串类型
- 定义
同样,我们可以看到字符串的声明是不需要特别声明类型的。
对比python,字符串类型必须使用双引号,单引号不可。
此外,多行声明须使用反引号,但是这个时候转义符不再生效,/允悲。
func main() {
var a =`终究
还是一个人
扛下了所有`
fmt.Println(a)
}
#输出
终究
还是一个人
扛下了所有
- 组合
支持加号连接,尽可能灵活即可。
func main() {
var a = "rabbit"
var b = "mask"
a += b
fmt.Println(a+"!")
}
#输出
rabbitmask!
4、派生类型
这个简单提及,后期根据进度展开。
(a) 指针类型(Pointer)
(b) 数组类型
(c) 结构化类型(struct)
(d) Channel 类型
(e) 函数类型
(f) 切片类型
(g) 接口类型(interface)
(h) Map 类型
二、常量变量
1、变量
上面交代了那么久的数据类型,最终还是为这里服务的,最基础的变量定义方式为:var identifier type
,此外也可灵活运用贴合Go的习惯。
- 定义类型而不初始化
变量默认为零值,当然布尔型默认为false上面已经提过了。 - 直接初始化自动判定变量类型
这个无论是上面的int还是字符串都很好的体现了这一点。 - 省略 var,
identifier := value
格式替代。这种不带声明格式的只能在函数体中出现,不可以用于全局变量的声明与赋值,使用操作符:=
可以高效地创建一个新的变量,称之为初始化声明。同第二种方式,其类型根据初始化数值自动判定。
func main() {
a := "rabbitmask"
fmt.Println(a)
}
#输出
rabbitmask
2、常量
定义方式为const identifier [type] = value
同样,可省略type自动判定。
支持批量常量定义,未赋值则默认为前面的初始值。
func main() {
const (
a=1
b=2
c
d
)
fmt.Println(a,b,c,d)
}
- iota 常量生成器
此外可借助iota批量生成常量。
func main() {
type num int
const (
a num=iota
b
c
d
)
fmt.Println(a,b,c,d)
}
#输出
0 1 2 3
三、基本逻辑
1、判断
-
if...else...
嵌套
func main() {
age :=18
if age>0{
if age<100{
fmt.Printf("%d?this's ok",age)
}
}else {
fmt.Println("Are u kidding me?")
}
}
#输出
18?this's ok
- switch 语句
func main() {
var grade string
marks := 90
switch marks {
case 90:
grade = "A"
case 80:
grade = "B"
case 50,60,70:
grade = "C"
default:
grade = "D"
}
fmt.Printf("grade is %s",grade)
}
#输出
grade is A
如果使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true,但是前提是成功执行当前语句,做个对比。
func main() {
var grade string
marks := 90
switch marks {
case 90:
grade = "A"
fmt.Printf("grade is %s",grade)
case 80:
grade = "B"
fmt.Printf("grade is %s",grade)
fallthrough
case 50,60,70:
grade = "C"
fmt.Printf("grade is %s",grade)
default:
grade = "D"
fmt.Printf("grade is %s",grade)
}
#输出
grade is A
func main() {
var grade string
marks := 90
switch marks {
case 90:
grade = "A"
fmt.Printf("grade is %s\n",grade)
fallthrough
case 80:
grade = "B"
fmt.Printf("grade is %s\n",grade)
case 50,60,70:
grade = "C"
fmt.Printf("grade is %s\n",grade)
default:
grade = "D"
fmt.Printf("grade is %s\n",grade)
}
}
#输出
grade is A
grade is B
2、循环
这里有个和其它语言较大带的差异点,go语言没有while语法,类似其他语言的while(1)
可以使用for ture
代替。
func main() {
var i, j int
for i = 1; i < 10; i++ {
for j = 1; j < 10; j++ {
fmt.Printf("%d X %d = %d ", i, j, i*j)
}
fmt.Print("\n")
}
}
#输出
小九九(略)
有疑问加站长微信联系(非本文作者)