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

}
相关推荐
IT·小灰灰1 分钟前
Python——自动化发送邮件
运维·网络·后端·python·自动化
Algorithm15766 分钟前
JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性
java·开发语言·jvm
Gnevergiveup7 分钟前
2024网鼎杯青龙组Web+Misc部分WP
开发语言·前端·python
边疆.21 分钟前
C++类和对象 (中)
c语言·开发语言·c++·算法
yy_xzz23 分钟前
QT编译报错:-1: error: cannot find -lGL
开发语言·qt
你不讲 wood26 分钟前
使用 Axios 上传大文件分片上传
开发语言·前端·javascript·node.js·html·html5
颜淡慕潇30 分钟前
【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】
后端·云原生·容器·kubernetes
林浔090634 分钟前
C语言部分输入输出(printf函数与scanf函数,getchar与putchar详解,使用Linux ubuntu)
c语言·开发语言
一颗甜苞谷1 小时前
开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码
java·开发语言·开源
CLCNboss1 小时前
Mac安装Ruby
开发语言·经验分享·笔记·macos·ruby