变量 相当于 内存中表示一个栈空间的存储的表示,我的历史理解是这样的。也不知道在Go语言这里对不对?变量是程序语言的基本组成之一,应该是在程序中很常见的一个单位。
变量的使用主要步骤为: 1.声明; 2.赋值; 3.使用;
package main
import "fmt"
// 定义在函数外的变量,叫全局变量 ,类似与c语言的成员变量。 java的属性?
var name string = "汪大为"
var age int = 20
//设计者认为,上面一个一个定义变量的写法太繁琐,可以用var()一次性声明
var (
stock = "TSLA"
price = ""
)
func main() {
// 定义在函数内部{}的变量叫局部变量。
//1.第一种变量的使用方式。
var num int = 18
fmt.Println("num = ", num)
//int声明不赋值的时候,默认值是0.
var num2 int
fmt.Println("num2=", num2)
var num3 = 18 // var的类型推断。
fmt.Println("num3", num3)
//4. var 省略形式,也可以做类型的自动推断。 := 冒号等号,不能写为 = 号。 多个:可以解决 sex的变量定义的问题。
sex := "男" //利用:, 定义一个sex变量
fmt.Println("sex :", sex)
//连续声明变量 ,后面一个string 会对 你我他三个变量都生效。
var i, you, it string
i = "我"
you = "你"
it = "它"
fmt.Println(i)
fmt.Println(you)
fmt.Println(it)
// 这种语法,java8 都是没有的。挺好的。
var a, b, c, d = 10, "b", 11, 12
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
// 这样连续 推断变量也是可以的。
a2, b2 := "你猜猜a", 19
fmt.Println(a2)
fmt.Println(b2)
}
讲了变量肯定不能少了变量的数据类型。Go和Java一样是一门强类型的语言。Go的变量数据类型有:
Go分为基本数据类型和派生复杂数据类型。
除基本类型外的,其他类型当前浏览了一下留个印象就可以了,比较初学阶段。 目前重点关注一下基本数据类型:
整数类形 int 细分可以有 int8 和 uint8,int16和uint16,int32和uint32,int64和uint32 ,外加一个byte整数类型。golang的整数类型,默认声明为int类型,即有符号;
这里的数字代表的是多少bit ,int 8 不一定就是8位,这个还要看操作系统如果是32位操作系统那就是8 ,如果64位操作系统还要乘以2;
而且整形分有无符号,u开头 为 “unsign” 无符号,常用的int32类型可写为rune 相当于java的int 。浮点数类型两个 float32 和 float64。讲到这个无符号uint ,这里简单说一下负数的二进制表示的解读。
1.如何获取一个数的二进制表示:
有符号 int 第一位是0 则是正数,第一位是1 则为负数。
对于负数的绝对值,是符号位以外的部分取反后再加1。
需求: 我们想用8bit的二进制表示-3
做法: -3,负号的首位 毋庸置疑 设置为1 ,
现在就处理剩下7个bit
先表示3 000 0011
取反 111 1100
加1 111 1101
添加上符号位 1111 1101
2.逆向过程,从一个二进制表示的负数 1111 1101 ,获取易读的表示(我觉得十进制更易读)
先看首位 是1,那么就写个负号 ,
再看剩下的7位数取反 0000010 ,这是2
再加1, 为得到绝对值为3,负号则乘以-1,我们可知其值为 -3.
package main
// 多个导入形式的import 语言,比java 省字符。
import (
"fmt"
"unsafe"
)
// 设计者认为,上面一个一个定义变量的写法太繁琐,可以用var()一次性声明
var ()
func main() {
// Printf 格式化函数。 %T 值类型。 unsafe.Sizeof(num3) 计算占用字节数
var defaultNum = 28
fmt.Printf("默认数值就是 %T ,对应的字节数:%s", defaultNum, unsafe.Sizeof(defaultNum))
// var num int8 = 128 cannot use 128 (untyped int constant) as int8 value in variable declaration (overflows)
var num1 uint8 = 128
fmt.Print(num1)
var num2 uint16 = 228
fmt.Print(num2)
var num3 uint32 = 328
fmt.Print(num3)
var num4 uint64 = 428
fmt.Print(num4)
var num5 rune = 528
fmt.Print(num5)
//byte类型
var age byte = 8
fmt.Println("age = ", age) // fmpl 通过idea快速打印出来。
//浮点类型的表示。
var num6 float32 = 3.14
fmt.Println("float32 = ", num6)
var num7 float32 = 314e-2
fmt.Println("科学及算法表示3.14, 314* 10^-2 =", num7)
var num8 float64 = 3.14e+2
fmt.Println("科学及算法表示314, 3.14* 10^2 =", num8)
//浮点数的精度损失,所以默认是 float64
var value1 float32 = 88.123456789
fmt.Println(value1) //88.123456789
var value2 float64 = 88.123456789
fmt.Println(value2) //88.123456789
// 目前感觉,用简写的var推断,感觉更为方便
value3 := 88.123456789
fmt.Println(value3) //88.123456789
}
布尔类型和char字符型,毫无意外归为基本数据类型,这点这块我暂时没有遇到哪个语言打破过(也有可能小弟我才疏学浅)。
和Java不同的是,string 类型竟然被当作基本数据类型,这一点上,简直和 javascript 是一个妈妈养大的一样。javascript 的string也是一个primitive type ,这两这块长得一样,就是javascript 没有char类型。