在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、整型Go语言的数值类型分为以下几种:整数、浮点数、复数,其中每一种都包含了不同大小的数值类型,例如有符号整数包含 int8、int16、int32、int64 等,每种数值类型都决定了对应的大小范围和是否支持正负符号。本节我们主要介绍一下整数类型。 哪些情况下使用 int 和 uint程序逻辑对整型范围没有特殊需求。例如,对象的长度使用内建 len() 函数返回,这个长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用 int 来表示。 二、浮点型Go语言提供了两种精度的浮点数 float32 和 float64,它们的算术规范由 IEEE754 浮点数国际标准定义,该浮点数规范被所有现代的 CPU 支持。
var f float32 = 16777216 // 1 << 24 fmt.Println(f == f+1) // "true"! 浮点数在声明的时候可以只写整数部分或者小数部分,像下面这样: const e = .71828 // 0.71828 const f = 1. // 1 很小或很大的数最好用科学计数法书写,通过 e 或 E 来指定指数部分: const Avogadro = 6.02214129e23 // 阿伏伽德罗常数 const Planck = 6.62606957e-34 // 普朗克常数 用 Printf 函数打印浮点数时可以使用“%f”来控制保留几位小数 package main import ( "fmt" "math" ) func main() { fmt.Printf("%f\n", math.Pi) fmt.Printf("%.2f\n", math.Pi) } 运行结果如下所示: 3.141593 3.14 三、复数Go语言拥有两种复数类型,分别是 complex64(32 位实数和虚数)类型和 complex128(64 位实数和虚数)类型。 var x complex128 = complex(1, 2) // 1+2i var y complex128 = complex(3, 4) // 3+4i fmt.Println(x*y) // "(-5+10i)" fmt.Println(real(x*y)) // "-5" fmt.Println(imag(x*y)) // "10" 复数使用 re+imi 来表示,其中 re 代表实数部分,im 代表虚数部分,i 代表根号负 1。如果一个浮点数或一个十进制整数后面跟着一个 i,例如 3.141592i 或 2i,它将构成一个复数的虚部,而复数的实部是 0: fmt.Println(1i * 1i) // "(-1+0i)", i^2 = -1 如果大家对复数的运算法则不是很了解,可以点击这里《复数运算法则》,其中详细的讲解了复数的加减乘除操作。 四、布尔类型一个布尔类型的值只有两种:true 或 false。if 和 for 语句的条件部分都是布尔类型的值,并且 var aVar = 10 aVar == 5 // false aVar == 10 // true aVar != 5 // true aVar != 10 // false Go语言对于值之间的比较有非常严格的限制,只有两个相同类型的值才可以进行比较,如果值的类型是接口(interface),那么它们也必须都实现了相同的接口。如果其中一个值是常量,那么另外一个值可以不是常量,但是类型必须和该常量类型相同。如果以上条件都不满足,则必须将其中一个值的类型转换为和另外一个值的类型相同之后才可以进行比较。 s != "" && s[0] == 'x' 其中 s[0] 操作如果应用于空字符串将会导致 panic 异常。 if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { // ...ASCII字母或数字... } 布尔值并不会隐式转换为数字值 0 或 1,反之亦然,必须使用 if 语句显式的进行转换: i := 0 if b { i = 1 } 如果需要经常做类似的转换,可以将转换的代码封装成一个函数,如下所示: // 如果b为真,btoi返回1;如果为假,btoi返回0 func btoi(b bool) int { if b { return 1 } return 0 } 数字到布尔型的逆转换非常简单, 不过为了保持对称, 我们也可以封装一个函数: // itob报告是否为非零。 func itob(i int) bool { return i != 0 } Go语言中不允许将整型强制转换为布尔型,代码如下: var n bool fmt.Println(int(n) * 2) 编译错误,输出如下: cannot convert n (type bool) to type int 布尔型无法参与数值运算,也无法与其他类型进行转换。 五、字符串一个字符串是一个不可改变的字节序列,字符串可以包含任意的数据,但是通常是用来包含可读的文本,字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码表上的字符时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。 定义字符串可以使用双引号
package main import ( "fmt" ) func main() { var str = "C语言中文网\nGo语言教程" fmt.Println(str) } 运行结果为: C语言中文网 Go语言教程 一般的比较运算符(==、!=、<、<=、>=、>)是通过在内存中按字节比较来实现字符串比较的,因此比较的结果是字符串自然编码的顺序。字符串所占的字节长度可以通过函数 len() 来获取,例如 len(str)。
字符串拼接符“+”两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。将 s2 追加到 s1 尾部并生成一个新的字符串 s。 str := "Beginning of the string " + "second part of the string"
也可以使用“+=”来对字符串进行拼接: s := "hel" + "lo," s += "world!" fmt.Println(s) //输出 “hello, world!” 字符串实现基于 UTF-8 编码Go语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问。当然,Go语言也支持按照传统的 ASCII 码方式逐字符进行访问。 定义多行字符串在Go语言中,使用双引号书写字符串的方式是字符串常见表达方式之一,被称为字符串字面量(string literal),这种双引号字面量不能跨行,如果想要在源码中嵌入一个多行字符串时,就必须使用 const str = `第一行 第二行 第三行 \r\n ` fmt.Println(str) 代码运行结果: 第一行 第二行 第三行 \r\n 反引号 const codeTemplate = `// Generated by github.com/davyxu/cellnet/ protoc-gen-msg // DO NOT EDIT!{{range .Protos}} // Source: {{.Name}}{{end}} package {{.PackageName}} {{if gt .TotalMessages 0}} import ( "github.com/davyxu/cellnet" "reflect" _ "github.com/davyxu/cellnet/codec/pb" ) {{end}} func init() { {{range .Protos}} // {{.Name}}{{range .Messages}} cellnet.RegisterMessageMeta("pb","{{.FullName}}", reflect.TypeOf((*{{.Name}})(nil)).Elem(), {{.MsgID}}) {{end}} {{end}} } ` 这段代码只定义了一个常量 codeTemplate,类型为字符串,使用 六、字符类型(byte和rune)字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。
var ch byte = 65 或 var ch byte = '\x41' //(\x 总是紧跟着长度为 2 的 16 进制数) 另外一种可能的写法是 var ch int = '\u0041' var ch2 int = '\u03B2' var ch3 int = '\U00101234' fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // integer fmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // character fmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8 bytes fmt.Printf("%U - %U - %U", ch, ch2, ch3) // UTF-8 code point 输出: 65 - 946 - 1053236 A - β - r 41 - 3B2 - 101234 U+0041 - U+03B2 - U+101234 格式化说明符
UTF-8 和 Unicode 有何区别?Unicode 与 ASCII 类似,都是一种字符集。
|
请发表评论