对於变数的Type,能够依据他们的特性分为两种,分别为不可变的Static type
以及可变的 Dynamic type
。
而这章节主要就是介绍静态型别,像是Boolean、String....等。
长度1bit,只能拿来当作true
, false
使用。
且在Go中Bool不能当作0或1使用(不能与数字作比较)
func main() {
var b bool = false
fmt.Println(b)
if b == false{
fmt.Println("b == false")
}
}
运算後会得结果
false
b == false
数字可以根据长度与浮点数等因素有着各种不同的型态,像是int、float等。
int8, int16, int32, int64
看名字就知道int後头的数字代表的是长度bit
举例来说8bit
表示排列组合有着2的八次方⇒ 256种可能性,这也就是一个byte的大小,
因此256种可能性会从-128 ~ 127
下面有个错误的范例
package main
import (
"fmt"
)
func main() {
var a int8 = 128;
fmt.Print(a)
}
运算後会得结果
# command-line-arguments
./variables.go:7:6: constant 128 overflows int8
uint8, uint16, uint32, uint64
和int相同,但unsigned就是没正负号意思。
如果是uint8
则可以存在256种可能性0~255)
package main
import (
"fmt"
)
func main() {
var a uint8 = 128;
fmt.Print(a)
}
运算後会得结果
128
float32, float64
通常都是拿精准度较高的float64
做使用,
毕竟小数点会有误差,使用float32
误差会比float64
来得大。
此外,Go语言当中并没有double
complex64, complex128
复数,较少用到,不过内建有这种型别运算时十分方便。
package main
import (
"fmt"
)
func main() {
var a complex64 = 2.4 + 3i
fmt.Print(a)
}
运算後会得结果
(2.4+3i)
Go当中没有char
的型别。
通常以string
或是 rune
来代替
package main
import (
"fmt"
)
func main() {
var s string = "Hello World"
fmt.Println(s)
}
运算後会得结果
Hello World
要注意的是,string中的字无法改变那怎麽办?常见办法有以下:
由於string中的文字没办法改,要创新的变数来接收。
rune
意思是符号,简单理解为UTF-8
中的一个符号。
因为Go语言中预设使用UTF-8
编码。
而UTF-8
编码中的每个字元长度不是固定,以8bit
为基本长度,范围为1~4个字节(1byte ~ 4bytes)
package main
import (
"fmt"
)
func main() {
var r = []rune("0")
fmt.Println(r)
r = []rune("Hello World")
fmt.Println(r)
}
运行後可得结果
[48]
[72 101 108 108 111 32 87 111 114 108 100]
长度到底是算符号数
还是byte数
?
func main() {
a := "哈罗 世界"
fmt.Println(a)
n := 0
for range a{
n++
}
fmt.Println(len(a))
fmt.Println(n)
}
运行後可得结果
哈罗 世界
13
5
运行後可得知,以for range迭代出的长度,就是以bytes
计算,
而len()
打印出的长度则是符号数,每个文字只算一个
byte用法非常多,通常会配合Slice[]
使用。
package main
import (
"fmt"
)
func main() {
var b = []byte("0")
fmt.Println(b)
b = []byte("Hello World")
fmt.Println(b)
}
运行後可得
[48]
[72 101 108 108 111 32 87 111 114 108 100]
这边看起来byte好像跟rune很类似,但是
package main
import (
"fmt"
)
func main() {
var a = []byte("哈罗 世界")
fmt.Println(a)
var b = []rune("哈罗 世界")
fmt.Println(b)
}
运行後可得结果
[229 147 136 229 155 137 32 228 184 150 231 149 140]
[21704 22217 32 19990 30028]
与上述一样,rune所记录的是每个字元的记忆体位置而非bytes数。
这边附上C语言与Go类型对比
C | Go | |
---|---|---|
char | byte | |
singed char | int 8 | |
unsigned char | uint8 | |
short | int16 | |
unsigned short | uint16 | |
int | int32 | |
unsigned int | uint32 | |
long | int32 | |
unsigned long | uint32 | |
long long int | int64 | |
unsigned long long int | uint64 | |
float | float32 | |
double | float64 | |
size_t | uint |
虽然C语言的int固定长度为4,但Go语言自己类型的int与uint在32位与64位下分别对应长度为4与8个字节,这是需要注意的一点。
最後则提及一下Go的正规表示法如何使用,它主要是透过内建包regexp
来做实作,下面我们就举个范例来说明
package main
import (
"fmt"
"regexp"
)
func main() {
buf := "abc azc a1c aac aab a3c bac"
reg1 := regexp.MustCompile(`a[0-9]c`)
if reg1 == nil {
fmt.Println("regexp err")
return
}
result := reg1.FindAllStringSubmatch(buf, -1)
fmt.Println("result = ", result)
}
运行後可得结果
result = [[a1c] [a3c]]
上面范例我们是想透过正规表示法找出符合规则a number c 的所有结果,简单的一个抛砖引玉让大家去知道该如何引用正规表示法到Go当中,若对正规表示法有浓厚兴趣者,可以到Wiki去了解更多相关资讯。
这章节主要是带大家熟悉与宣告静态的变数,那在下章节开始会着重於动态变数的宣告,这部分的使用会更加重要,尤其会凸显与其他程序语言的不同,敬请期待。
https://zh.wikipedia.org/wiki/正则表达式
<<: [Day 05] 当我~们同在一起在17在17 (k-means 理论篇)
>>: [Day 5] 阿嬷都看得懂的 HTML 标签怎麽写
Odoo模组开发实战 目录 1.models介绍 2.常用的模型属性 第一章 models介绍 第二...
前言 昨天才刚讲完NN的缺点,今天就要先来介绍CNN,主要是CNN是图像辨识中一个很重要的突破,但是...
好一阵子没写单元测试与整合测试了,大家是否觉得有些生疏了呢? 之前的测试都写得很简单,正好昨天好好...
前言 前一章节简单的聊了一下 JSON 之後,接下来我想额外补充一个关於 CSV 档案处理的部分,而...
小的时候,曾有个做科学家的梦想,但不得其门而入,直到上了研究所,才慢慢了解科学家的由来。 在台湾,国...