Go 基础学习 - 第二天 (基本数据类型)

基本数据类型

Go 语言是一种静态类型的变成语言,在Go编程语言中,数据类型用于声明函数和变量,数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。编译器在进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配内存表示什么。

布尔型

布尔型的值只可以是常量 true 和 false


package main

import "fmt"

func main() {
	// var 变量名 数据类型
	// bool: 默认值为 false
	var isFlag bool = true
	fmt.Printf("%T,%t\n",isFlag,isFlag)
}

数值类型

整型 int 和浮点型 float32\float64, Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。

Go 也有基于架构的类型,例如:unit 无符号、int 有符号

  • 整形
序号类型和描述
1unit8 无符号 8 位整型(0到255)
2unit16 无符号 16 位整型(0到65535)
3unit32 无符号 32 位整型(0到4294967295)
4unit64 无符号 64 位整型(0到18446744073709551615)
5int8 有符号 8 位整型(-128到127)
6int16 有符号 16 位整型(-32768到32767)
7int32 有符号 32 位整型(-2147483648到2147483647)
8int64 有符号 64 位整型(-9223372036854775808到9223372036854775807)

查询占用的空间大小 字节数 :unsafe.Sizeof()


package main

import "fmt"

func main() {
	// var 变量名 数据类型
	var age int = 18
	var money float64 = 3.9
	fmt.Printf("%T,%d\n",age,age) // int,18
	fmt.Printf("%T,%.2f\n",money,money) // float64, 默认是6位小数

	num:=30
	fmt.Printf("num=%v 类型:%T\n",num,num)
	fmt.Println(unsafe.Sizeof(num)) // 表示64位的计算机 int 就是 int64 占用8个字节
}

其他更多的数字类型

  • byte 和 rune
序号类型和描述
1byte 类似 unit8
2rune 类似 int32
3unit 32 或 64
4int 与 unit 一样大小
5uintptr 无符号整型,用于存放一个指针
  • 浮点型
序号类型和描述
1float32 IEEE-754 32位浮点型
2float64 IEEE-754 64位浮点型
3complex64 32位实数和虚数
4complex128 64位实数和虚数

输出浮点类型数据:%.2f
精度丢失的问题:(而精致浮点数精度丢失)

m1 := 8.2
m2 := 3.8
fmt.Println(m1 - m2) // 结果 4.4 ,打印 4.39999999999

解决方案:[https://github.com/shopspring/decimal]

  • 先下载
  • 再引入
package main

import (
	"fmt"
	"decimal"
)

m1 := 8.2
m2 := 3.8
m3 := decimal.NewFromFloat(m1).Sub(decimal.NewFromFloat(m2))
fmt.Println(m3) 

字符串

GO的字符串是由单个字节链接起来的。Go语言的字符串的字节使用UTF-8编码标识 Unicode的。【string】

  • 字符串拼接符号 

  • 转义字符 (\\ , \", )

  • \n 换行;\t 制表符

  • 文件中的换行:\r\n

  • 多行字符串使用 反引号 " ` "

  • 字符串中常用方法

  • strings 包需要引入

  • 切片(也叫数组)
    arr := []string{"php","java","golang"}

方法介绍
len(str)求长度
+ 或 fmt.Sprintf拼接字符串(注意 + 写的位置)
strings.Split切片,分割
strings.contains判断是否包含
strings.HasPrefix,strings.HasSuffix前缀/后缀判断
strings.Index(),strings.lastIndex()子串出现的位置
strings.Join(a[]string, sep string)join操作

注意:strings.Index(),strings.lastIndex() 查找不到返回 -1 ,查找到返回下标的位置,下标从 0 开始


package main

import "fmt"

func main() {
	// 字符串定义
	var str1 string = "str1"
	var str2 = "str2"
	str3 := "str3"

	var str string
	str = "sjskjdskjdks"
	fmt.Printf("%T,%s\n",str,str)

	// 单引号, 整形ASCII 编码
	v1 :='A'
	v2 := "A"

	// 编码表:ASCII 表 
   // 扩展
   // 所有中国字的编码表 :GBK
   // 全世界的编码表 :Unicode
   
	fmt.Printf("%T,%d\n",v1,v1) // int32,65
	fmt.Printf("%T,%d\n",v2,v2)
}

数据类型的转换

在必要以及可行的情况下,一个类型的值可以转换成另一种类型的值。
由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:
valueOfTypeB = typeB(valueOfTypeA)

  • 在go语言中没法将整形转换成 bool
  • bool 无法参数数值运算,也无法与其他类型进行转换
package main

import "fmt"

func main() {
	a:=3 //int
	b:=5.0 // float64
	
	// 将 int 类型的a转换为 float64 类型
	c := float64(a)
	d := int(b)
    
    // bool 整形是不能转换为 bool 类型的
    // e := bool(a)
    
    // float64 尽量使用 float64 来定义浮点类型的小数
	fmt.Printf("%T\n",a) // int
	fmt.Printf("%T\n",b) // float64
	fmt.Printf("%T\n",c) // float64
	fmt.Printf("%T\n",d) // int
	fmt.Printf("%T\n",e) //.\hello.go:14:15: cannot convert a (variable of type int) to type bool
}

strconv包

  • strconv.FormatInt
  • strconv.Formatfloat(float64(f), ‘f’, 4, 32)
  • strconv.FormatBool // 意义不大
  • strconv.FormatUint( uint64(a), 10)
package main

import "fmt"
import "strconv"

func main() {
	var i int = 20
	str :=strconv.FormatInt(int64(i), 10) // int64 和操作系统有关系
	
	fmt.Printf("%v,%T", str, str) // 20,string
}

字符串转换成数值

  • strconv.ParseInt(参数1:string, 参数2:进制, 参数3:位数 32 64 16)
  • string 类型转换成 bool 类型的意义不大,不介意进行转换
  • 数值类型没法和bool类型进行转换

默认值

int 默认值是0
float 默认值是 0
string 默认是空

  • 一个汉字占用 3 个字节(utf-8), 一个字母占用一个字节
  • golang 中使用的是 utf-8 编码,编码后对应的值就是 int 类型

Printf 格式化参数常用

Printf
%v : 值
%T : 类型
%c
%.2f : 浮点类型
%d : 整数
%t : bool
%c : byte

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值