golang 基本数据类型

1. go语言的数据类型简介

golang的数据类型分为两大类,一类是基本数据类型和符合数据类型;

按照传递的内容分:传递本身数据和传递地址;

golang和java很相似,都是值传递,不过分为传递的值和传递的地址,传递地址的叫做引用传递;

2.基本数据类型

基本数据类型有:整数、浮点数、布尔型、字符

2.1 整数类型

(1)介绍

|--------|----------------|------|------|
| 类型 | 范围 | 占用空间 | 有无符号 |
| int8 | -2^7到2^7-1 | 1个字节 | 有 |
| int16 | -2^15到2^15-1 | 2个字节 | 有 |
| int32 | -2^31到2^31-1 | 4个字节 | 有 |
| int64 | -2^63到2^63-1 | 8个字节 | 有 |
| uint8 | 0到2^8-1 | 1个字节 | 无 |
| uint16 | 0到2^16-1 | 2个字节 | 无 |
| uint32 | 0到2^32-1 | 4个字节 | 无 |
| uint64 | 0到2^64-1 | 8个字节 | 无 |

注意: 在使用 int 和 uint 类型时,不能假定它是 32 位或 64 位的整型,而是考虑 int 和 uint可能在不同平台上的差异。

注意事项: 实际项目中整数类型、切片、 map 的元素数量等都可以用 int 来表示。

在涉及 到二进制传输、为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使 用 int 和 uint 。

(2)整数常见的进制以及占位符表示

Go 复制代码
package main

import "fmt"

func main() {
	//二进制
	a := 0b1001
	fmt.Printf("%d \n", a)
	fmt.Printf("%b \n", a)
	//十进制
	b := 0377
	fmt.Printf("%o \n", b)
	//十六进制
	c := 0xff
	fmt.Printf("%d \n", c)
    // 显示数据的数据类型
    fmt.Printf("%T \n",c)
}

2.2 浮点数

|---------|------|----------------------|
| 类型 | 存储空间 | 范围 |
| float32 | 4字节 | -3.403e38~3.403e38 |
| float64 | 8字节 | -1.798e308~1.798e308 |

Go 复制代码
import (
	"fmt"
	"unsafe"
)

func main() {
	var float1 float32 = 1.23
	fmt.Printf("%f \n", float1) //默认保留6位小数
	fmt.Printf("%.2f \n", float1)
	//float32 占用4位,并且类型位float32
	var a float32 = 3.14
	fmt.Printf("值为%v--%f,类型%T\n", a, a, a)
	fmt.Println(unsafe.Sizeof(a)) //占4个字节
	//float64 占用8位,并且类型位float64
	var b float64 = 1.23
	fmt.Printf("值为%v--%f,类型%T\n", b, b, b)
	fmt.Println(unsafe.Sizeof(b))

}

Golang 中 float 精度丢失问题

几乎所有的编程语言都有精度丢失这个问题,这是典型的二进制浮点数精度损失问题,在定

长条件下,二进制小数和十进制小数互转可能有精度丢失。这个问题在银行系统中特别致命。

如何解决:在java中有一个叫做bigdecimal的类可以解决这个问题,在golang中也有一个decimal可以解决这个问题

Go 复制代码
package main

import (
	"fmt"
	"github.com/shopspring/decimal"
)

func main() {
	decimal1, err := decimal.NewFromString("1129.6")
	decimal2, err := decimal.NewFromString("100")
	result := decimal1.Mul(decimal2)
	if err != nil {
		fmt.Println("转化失败:", err)
	}
	fmt.Println(result)
}

2.3 布尔类型

Go 复制代码
var fl = false
if f1 {
    fmt.Println("true")
} else {
    fmt.Println("false")
}

2.4 字符串类型

Go语言里的字符串的内部实现使用UTF-8编码。字符串的值为双引号(")中的内容

字符串处理的基本方法

Go 复制代码
package main

import (
	"fmt"
	"strings"
)

func main() {
	var str string = "hello,world"
	//len求字符串的长度
	fmt.Println(len(str))
	//fmt.sprintf拼接字符串
	fmt.Println(fmt.Sprintf("我真的%s", "帅"))
	//字符串中是否包含
	fmt.Println(strings.Contains(str, "hello"))
	//以,分割字符串
	fmt.Println(strings.Split(str, ","))
	arr := []string{"hello", "world"}
	//拼接字符串,sep什么为间隔
	fmt.Println(strings.Join(arr, ","))
	//是否有后缀
	fmt.Println(strings.HasSuffix(str, "world"))
	//是否有前缀
	fmt.Println(strings.HasPrefix(str, "hello"))
	//子字符串最开始出现的位置
	fmt.Println(strings.Index(str, "ell"))
	//子字符串最后开始出现的位置
	fmt.Println(strings.LastIndex(str, "l"))
}

2.5字符

组成每个字符串的元素叫做 "字符",可以通过遍历字符串元素获得字符。字符用单引号 '' 包裹起来

Go语言中的字符有以下两种类型

uint8类型:或者叫byte型,代表了ACII码的一个字符

rune类型:代表一个UTF-8字符

当需要处理中文,日文或者其他复合字符时,则需要用到rune类型,rune类型实际上是一个int32

Go使用了特殊的rune类型来处理Unicode,让基于Unicode的文本处理更为方便,也可以使用byte型进行默认字符串处理,性能和扩展性都有照顾。

需要注意的是,在go语言中,一个汉字占用3个字节(utf-8),一个字母占用1个字节

Go 复制代码
package main

import "fmt"

func main() {
	var a byte = 'a'
	fmt.Println(a)
	fmt.Printf("%c \n", a)
	s := "你好,golang"
	//使用len 循环相当于打印的是ascii码
	for i := 0; i < len(s); i++ {
		fmt.Printf("%v(%c)\t", s[i], s[i])
	}
	//通过rune打印的是 utf-8字符
	for i, i2 := range s {
		fmt.Println(i, i2)
	}

	s1 := "golang"
	byte1 := []byte(s1)
	byte1[0] = 'o'
	fmt.Println(string(byte1))

	s2 := "你好,世界"
	byte2 := []rune(s2)
	byte2[0] = '不'
	fmt.Println(string(byte2))
}

3.基本数据类型的转化

3.1数值类型的转化
Go 复制代码
package main

import "fmt"

func main() {
	var a int16 = 8
	var b int64 = 16
	fmt.Println(int64(a) + b)

	var c int8 = 12
	var d float32 = 32
	fmt.Println(float32(c) + d)
}
3.2 转化成字符串
Go 复制代码
import (
	"fmt"
	"strconv"
)

func main() {
	//通过sprint转化成字符串
	s1 := fmt.Sprintf("%d", 1)
	fmt.Println(s1)
	//痛殴strconv转化
	var num float64 = 3.14
	fmt.Println(strconv.FormatFloat(num, 'f', -1, 64))
}
3.3 字符串转化成int和float类型
Go 复制代码
import (
	"fmt"
	"strconv"
)

func main() {
	str := "10"
	str2 := "3.14"
	fmt.Println(strconv.ParseInt(str, 10, 64))
	fmt.Println(strconv.ParseFloat(str2, 64))

}
相关推荐
前端兰博8 分钟前
01-Java开发基础语言
后端
SL-staff14 分钟前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
前端兰博14 分钟前
02-Servlet、JDBC、Maven、Mybatis
后端
xurime38 分钟前
Excelize 开源十周年,发布 2.11.0 版本
golang·开源·github·excel·导出·导入·excelize·基础库
咖啡八杯1 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
码事漫谈2 小时前
Loop 正在排斥人为操作
后端
爱勇宝2 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
2zcode2 小时前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab
庄周de蝴蝶2 小时前
梅开二度,这次拿下系统分析师
后端·程序员
必须得开心呀3 小时前
QT解决中文乱码问题
开发语言·qt