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))

}
相关推荐
_extraordinary_1 分钟前
Java Spring日志
java·开发语言·spring
间彧8 分钟前
Nacos详解与项目实战
后端
间彧8 分钟前
nginx、网关Gateway、Nacos、多个服务实例之间的数据链路详解
后端
间彧10 分钟前
Nacos与Eureka在性能上有哪些具体差异?
后端
间彧11 分钟前
详解Nacos健康状态监测机制
后端
间彧13 分钟前
如何利用Nacos实现配置的灰度发布?
后端
毕业设计制作和分享26 分钟前
springboot159基于springboot框架开发的景区民宿预约系统的设计与实现
java·spring boot·后端
初圣魔门首席弟子27 分钟前
【C++ 学习】单词统计器:从 “代码乱炖” 到 “清晰可品” 的复习笔记
开发语言·c++
lsx20240634 分钟前
SQL UPDATE 语句详解
开发语言
郝学胜-神的一滴1 小时前
计算机图形学中的光照模型:从基础到现代技术
开发语言·c++·程序人生·图形渲染