【go-03】变量与数基本据类型

一、变量的概念
变量,表示内存中的一个存储区域
该区域有自己的名称(变量名)和类型(数据类型)
二、变量的使用步骤
  1. 声明(定义)  2. 赋值  3. 使用
package main

import (
	"fmt"
	"strconv"
	"unsafe"
)

var myAge int = 19 // 全局变量

func main() {

	var age int      // 声明
	age = 18         // 赋值
	fmt.Println(age) // 使用 18

	// 2 声明赋值一起
	var num int = 19
	fmt.Println(num) // 19

	// 3 不赋值,变量声明后不赋值,会有默认值比如 int 默认值 0 string 默认值为空串,小数默认为 0
	var num2 int
	fmt.Println(num2) // 0

	// 4 省去类型,根据=后边的值自动推断类型呢
	var num3 = 10.25
	fmt.Println(num3) // 10.25

	// :=  最常用
	num5 := 222
	fmt.Println(num5) // 222

	// 多变量一次性定义
	var (
		n1 = 100
		n2 = 200
	)
	fmt.Println(n1, n2)
	fmt.Println(myAge)

	// 注意:变量类型不能随意变化(区别于PHP),也不能超出范围
	// 变量=变量名+值+数据类型,变量的三要素
	// 变量定义了一定要使用,不使用会报错
}
三、go程序中 + 的使用
// + 号的使用
func plus() {
	num1 := 10
	num2 := 20
	num := num1 + num2 // 两边是数值时,是运算符+
	fmt.Println(num)   // 30

	str1 := "我们"
	str2 := "来啦"
	str := str1 + str2 // 两边是字符串时,拼接符+
	fmt.Println(str)   // 我们来啦
}
四、go数据类型
基本类型:数值 字符  布尔  字符串
复杂类型:指针  数组  结构体  管道  函数   切片  接口  map
(复习下PHP的数据类型,
基本:布尔型(Boolean)、整型(Integer)、浮点型(Float/Double)、字符串型(String)
复合:数组,对象
特殊:null,资源如:数据库连接)
五、go数据类型-整型
1)有符号
int8          1字节       -128     ~    127
int16         2 字节      -32768  ~ 32767
Int32         4 字节        -2的31次方(21.4亿)  ~ 2的31次方-1
Int64         8 字节      -2的63次方    ~  2的63次方-1
2)无符号
Uint8       1字节        0     ~    255
Uint16     2 字节      0 ~ 2的16次方-1
Uint32     4 字节       0  ~ 2的32次方-1
Uint64     8 字节      0  ~  2的64次方-1
3)其他
Int      32位系统4字节   -2的31次方 ~ 2的31次方-1
          64位系统8字节   -2的63次方 ~ 2的64次方-1
Uint   32位系统4字节   -2的32次方 ~ 2的32次方-1
           64位系统8字节   -2的64次方 ~ 2的64次方-1
Rune  与int32一样    表示一个unicode码
Byte   无符号   与uint8一样   存储字符时选用byte
4)go中打印数据类型和占用字节
// go中打印数据类型和占用字节
func zijie() {
	var n2 int64 = 10
	fmt.Printf("n2的类型为 %T 占用字节为 %d", n2, unsafe.Sizeof(n2)) // 8
}
5) bit: 计算机中的最小存储单位。 byte: 计算机中基本存储单元。 1byte = 8 bit
六、数据类型-小数类型/浮点型
  1. 单精度float32   4字节   
  2. 双经度float64   8字节
  3. 浮点数都是有符号的
  4. 浮点数 = 符号位 + 指数位 + 尾数位( 尾数部分可能丢失,造成精度损失。 )
  5. float64 的精度比 float32 的要准确
  6. 浮点型默认声明为 float64 类型
七、数据类型-字符类型
  1. Golang 中没有字符类型,存单个字符用 byte
  2. 传统字符串=n个字符连接起来。go字符串=n个byte(字节)连接起来
  3. Go字符中只能用单引号
// go数据类型字符
func goByte() {
	var c1 byte = 'a' // 按照编码值存储97
	var c2 byte = 10
	c3 := c1 + c2
	fmt.Println(c3) // 107

	var c4 int = '北'                              // 只能单引号不能双引号
	fmt.Println(c4)                               // 21271
	fmt.Printf("The character read is: %c\n", c4) // 取出字符 北
}
八、数据类型-布尔类型
  1.   布尔类型也叫 bool 类型, bool 类型数据只允许取值 true false
  2. bool 类型占 1 个字节。
  3. bool 类型适于 逻辑运算,一般用于程序流程控制(if  for)
// go 数据类型bool
func goBool() {
	var v1 bool = true // 值只能是true和false
	fmt.Println(v1)

	var v3 bool = 5 < 10
	fmt.Println(v3)
}
九、数据类型-string类型
  1. 字符串的两种表示形式
        双引号,能识别转义符  str := "双引号\n能识别转义字符”
        反引号,原样输出,类似PHP中的单引号
  1. 字符串的拼接  var str = “hello" + "world"
十、数据类型-默认值
  1. 整型          0
  2. 浮点型      0
  3. 字符串      “” 
  4. 布尔类型  false
// go数据类型默认值
func goVarableDefault() {
	var v1 int
	var v2 float32
	var v3 float64
	var v4 bool
	var v5 string
	fmt.Println("int默认值", v1, "float32默认值", v2, "float64默认值",
                 v3, "bool默认值", v4, "string默认值", v5)
	// int的默认值 0 float32默认值 0 float64默认值 0 
    // bool默认值 false string默认值
}
十一、数据类型-基本数据类型转换(除srting和bool)
      数值  字符  (除bool 字符串)
  1. Golang 中数据类型 不能自动转换(区别于PHP)
  2. 转换公式为  T(v) 
  3. 可从大转小,也可从小转大,值必须在范围内
  4. 被转换的是变量存储的数据 ( 即值 ) ,变量本身的数据类型并没有变化!
  5. 转换溢出时不会报错, 按溢出处理,转换时需要考虑范围
int(), int8(),int64(),float32(),float64(),byte()
十二、数据类型-其他类型转string
  1. 方式 1 fmt.Sprintf("% 参数 ", 表达式 )
   %v      值的默认格式表示
   %t      单词true或false
   %b      表示为二进制
   %c      该值对应的unicode码值
   %d      表示为十进制
   %f      有小数部分但无指数部分,如123.456
   %T      值的类型的Go语法表示
   %q      该值对应的单引号括起来的go 语法字符字面值,必要时会
// 其他类型转string
func dataConvertStr() {
    var n1 int = 19
    var n2 float32 = 4.78
    var n3 bool = false
    var n4 byte = 'a'


    var s1 string = fmt.Sprintf("%d", n1)
    fmt.Printf("s1对应的类型是:%T,s1 = %v", s1, s1)
    fmt.Println()


    var s2 string = fmt.Sprintf("%f", n2)
    fmt.Printf("s2对应的类型是:%T,s2 = %v", s2, s2)
    fmt.Println()


    var s3 string = fmt.Sprintf("%t", n3)
    fmt.Printf("s3对应的类型是:%T,s3 = %v", s3, s3)
    fmt.Println()


    var s4 string = fmt.Sprintf("%c", n4)
    fmt.Printf("s4对应的类型是:%T,s4 = %v", s4, s4)
    fmt.Println()
}
采用安全的转义表示
  1. 方式 2 :使用 strconv 包的函数 不好用,不推荐
十二、数据类型-string转其他类型
// 字符串转其他类型
func strToOther() {
    //1.string转bool
    var s1 string = "true"
    var b bool
    // 返回字符串表示的 bool 值。它接受 1、0、t、f、T、F、true、false、True、False、TRUE、FALSE;否则返回错误。
    b, _ = strconv.ParseBool(s1)
    fmt.Println(b)


    //2.string转int
    var s2 string = "19"
    var num1 int64
    // 参数1:要转换的字符串,参数2:进制base 2~36, 参数3:bitSize int8,int16。。。
    num1, _ = strconv.ParseInt(s2, 10, 64)
    fmt.Println(num1)


    //2.string转float
    var s3 string = "3.14"
    var f1 float64
    // 参数1:要转换的浮点型字符串,参数2:32或者64
    f1, _ = strconv.ParseFloat(s3, 64)
    fmt.Println(f1)


    var s4 string = "golang"
    var b1 bool
    b1, _ = strconv.ParseBool(s4)
    fmt.Println(b1) // false


    var s5 string = "golang"
    var num2 int64
    num2, _ = strconv.ParseInt(s5, 10, 64)
    fmt.Println(num2) // 0
}
十三、复杂类型-指针
1. 普通变量,内存里存的是值和类型
2. 指针变量,指针就是内存地址,地址指向的空间才是值
3. 获取变量地址,&+变量名
// 获取变量地址 &+变量名
func getVarAdd() {
    // 普通变量
    var n int = 10
    fmt.Println(&n) // 0x1400000e140


    // 指针变量
    var n1 *int = &n // 指针变量,存的是一个地址,地址指向的空间才是值和类型
    fmt.Println(n1)  // 0x1400000e140
    fmt.Println(*n1) // 10
}
4. 指针变量的声明, var ptr *int = &n
5. 获取指针变量指向的值,用 * 如:*n1
6. 值类型都有对应的指针类型,形式 *数据类型 (*int系列 *float系列 *bool *string *数组 *结构体)
十四、值类型和引用类型
1) 值类型:  int 系列 , float 系列 , bool, string 、数组和结构体 struct
2) 引用类型:指针、 slice 切片、 map 、管道 chan interface 等都是引用类型
3)  值类型:变量直接存储值,内存通常在栈中分配
4) 引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据 ( ) ,内存通常在堆
上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由 GC 来回收
十五、标识符
凡是自己可以起名字的地方都叫标识符(变量,函数,包)
命名规则
1. 组成部分:数字,字母,下划线_
2. 四个注意:数字不能开头,严格区分大小写,不能有空格,不能用保留关键字
3. 下划线 "_" 本身在 Go 中是一个特殊的标识符,称为空标识符。可以代表任意其他的标识符,但是它对应的值会被忽略 (比如:忽略某个返回值)。所以仅能被作为占位符使用,不能单独作为标识符使用。
4. 包名:尽量保持 package 的名字和目录名一致 ,尽量采取有意义的包名,简短,有意义
5.   变量名、函数名、常量名:采用驼峰法
6.  如果变量名、函数名、常量名首字母大写,则可以被其他的包访问, 如果首字母小写,则只能在本包中使用
注意:import 导入语句通常放在文件开头包声明语句的下面。导入的包名需要使用双引号包裹起来,包名是从 $GOPATH/src/ 后开始计算的,使用 / 进行路径分隔。
十六、系统保留关键字/标识符
  • 38
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值