Go- 基本类型和运算符
发布于: 1 小时前
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
布尔类型
数字类型
运算符和优先级
类型别名
字符类型
代码示例可以直接运行
package main
import (
"fmt"
"math/rand"
"time"
)
/*
位移使用举例
*/
type ByteSize float64 /* 类型别名 */
const (
_ = iota
KB ByteSize = 1 << (10 * iota)
MB
GB
TB
PB
EB
ZB
YB
)
func genRandNums() {
for i := 0; i < 10; i++ {
a := rand.Int()
fmt.Printf("%d, ", a)
}
fmt.Printf("\n")
for i := 0; i < 5; i++ {
r := rand.Intn(8)
fmt.Printf("%d, ", r)
}
fmt.Printf("\n")
timens := int64(time.Now().Nanosecond())
rand.Seed(timens)
for i := 0; i < 10; i++ {
fmt.Printf("%2.2f, ", 100*rand.Float32())
}
fmt.Printf("\n")
}
func main() {
/*
Go 是强类型语言,不会进行隐式转换,任何不同类型之间的转换必须显示说明
Go 不存在运算符的重载,表达式的解析顺序固定从左到右
只有两个类型相同的值才可以进行比较,如果其中一个值是常量,那么另一个的类型必须和该常量类型兼容
*/
/*
布尔类型
*/
var a = 10
// 值的比较结果为布尔值
fmt.Println(a == 5) // == false
fmt.Println(5 != 3) // != true
/* 以下用法均会出错
fmt.Println(!a) // 编译出错:invalid operation: !a (operator ! not defined on int)
fmt.Println(1 && 2) // 编译出错:1 && 2 (operator && not defined on untyped int)
fmt.Println(0 && 2) // 编译出错:0 && 2 (operator && not defined on untyped int)
fmt.Println(1 || 2) // 编译出错:1 || 2 (operator || not defined on untyped int)
fmt.Println(0 || false) // 编译出错:0 || false (operator || not defined on untyped int)
*/
// && 和 || 为短路运算符,&& 出现条件为 false,整体为 false; || 出现条件为 true,整体为 true
fmt.Println(!false) // true
fmt.Println(false && true) // false
fmt.Println(true && true) // true
fmt.Println(false || true) // true
fmt.Println(false || false) // false
fmt.Printf("%t\n", 1 == 1) // %t 格式化输出 true
// TIPS: 布尔值使用 is/Is进行命名可读性比较好
/*
数字类型
1、某些数字类型长度由运行程序所在的操作系统决定,如:int和uint(32位系统4个字节,64位系统8个字节)、uintptr(设定为足够存放一个指针)
2、以下数字类型和操作系统无关,有固定字节长度
int8、int16、int32、int64
uint8、uint16、uint32、uint64
float32(精确到小数点后7位)、float64(精确到小数点后15位)
3、整型零值为 0,浮点型零值为 0.0
!!! 尽可能使用float64,因为 math 包中所有有关数学运算的函数都会要求接收这个类型
*/
var x float32 = 1 / 3
var y float64 = 1 / 3
fmt.Println(x, y) // 0 0
var m float32 = 1.0 / 3
var n float64 = 1.0 / 3
fmt.Println(m, n) // 0.33333334 0.3333333333333333
var q uint16 = 077 // 8进制数
var t uint32 = 0xD5 // 16进制数
var w uint64 = 7.8e10 // 10的连乘
z := uint64(t) // 类型转换
fmt.Println(q, t, w, z)
/* Go不允许类型混用,但对常量的类型限制非常少 */
var a1 int
var b1 int32
a1 = 5
//b1 = a1 // 编译错误:cannot use a1 + a1 (type int) as type int32 in assignment
//b1 = a1 + a1 // 编译错误:cannot use a1 + a1 (type int) as type int32 in assignment
b1 = b1 + 10 // 正常执行
b1 = int32(a1) // 显示进行类型转换
fmt.Println(a1, b1)
/*
数值类型进行格式化输出
*/
fmt.Printf("%d\n", 10) // 10 整数
fmt.Printf("%x\n", 122) // 7a 16进制数字
fmt.Printf("%X\n", 122) // 1A 16进制数字
fmt.Printf("%g\n", 0.555) // 0.555 浮点数
fmt.Printf("%f\n", 0.555) // 0.555000 浮点数
fmt.Printf("%e\n", 3.4) // 3.400000e+00 科学计数法
fmt.Printf("%05d\n", 10) // 00010 指定数值长度
fmt.Printf("%05.2f\n", 1.2) // 01.20 小数点之后2位,数据长度5位,长度不足前补0
/*
复数
复数最好使用类型 complex128,因为相关函数都使用这个类型的参数
*/
var c1 complex64 // 32位实数和虚数
var c2 complex128 // 64位实数和虚数
c1 = 5 + 10i
c2 = -5 + 2i
fmt.Printf("%v\n", c1) // 格式化输出复数
fmt.Printf("%v\n", c2)
c1 = complex(1.2, 5) // 实部和虚部使用浮点数
fmt.Printf("%v\n", c1)
r := real(c1) // 获得复数实部
v := imag(c1) // 获得复数虚部
fmt.Println(r, v)
/*
位运算 与、或、非、取反、左移、右移
只能用于整数类型变量,且变量等长
*/
fmt.Println(1 & 0) // 0
fmt.Println(0 & 0) // 0
fmt.Println(1 & 1) // 1
fmt.Println(1 | 0) // 1
fmt.Println(0 | 0) // 0
fmt.Println(1 | 1) // 1
fmt.Println(1 ^ 0) // 1
fmt.Println(1 ^ 1) // 0
fmt.Println(0 ^ 0) // 0
fmt.Println(0 ^ 1) // 1
var e1 uint8 = 0xFF
fmt.Printf("%08b\n", e1) // 11111111 二进制输出
fmt.Printf("%08b\n", ^e1) // 00000000 取反
fmt.Println(8 >> 2) // 2
fmt.Println(8 << 1) // 16
/*
逻辑运算符 == != < <= > >=
*/
/*
算术运算符
+ - * /
+= -= *= /=
%(取余,只能用于整数)
++ -- ()
*/
/*
随机数
*/
genRandNums()
/*
运算符与优先级
优先级 运算符
7 ^ !
6 * / % << >> & &^
5 + - | ^
4 == != < <= >= >
3 <-
2 &&
1 ||
*/
/*
字符类型
byte 类型是 uint8 的别名
*/
var ch1 byte = 65
var ch2 byte = '\x41' // \x后面紧跟2个16进制数
var ch3 byte = '\377' // \后面紧跟3个8进制数
var ch4 int = '\u0041' // Unicode字符 \u紧跟4个16进制数
var ch5 int = '\U00000041' // Unicode字符 \U紧跟8个16进制数
fmt.Printf("%d, %d, %d, %d, %d\n", ch1, ch2, ch3, ch4, ch5) // 65, 65, 255, 65, 65
fmt.Printf("%c, %c, %c, %c, %c\n", ch1, ch2, ch3, ch4, ch5) // A, A, ÿ, A, A
fmt.Printf("%X, %X, %X, %X, %X\n", ch1, ch2, ch3, ch4, ch5) // 41, 41, FF, 41, 41
fmt.Printf("%U, %U, %U, %U, %U\n", ch1, ch2, ch3, ch4, ch5) // U+0041, U+0041, U+00FF, U+0041, U+0041
}
复制代码
划线
评论
复制
发布于: 1 小时前阅读数: 5
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/2ad08d09babd02c1cb4d73dc4】。文章转载请联系作者。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论