写点什么

Go- 基本类型和运算符

用户头像
HelloBug
关注
发布于: 1 小时前
Go- 基本类型和运算符

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
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 基本类型和运算符