返回顶部
首页 > 资讯 > 后端开发 > GO >go语言中基本数据类型及应用快速了解
  • 822
分享到

go语言中基本数据类型及应用快速了解

2024-04-02 19:04:59 822人浏览 独家记忆
摘要

目录整数特殊的整数类型如果想确定int和uint的大小溢出浮点数复数布尔值字符串字符串的“长度”与遍历字符串的做法字符串的“长度”遍历

整数

按位长度分度分为:8位,16位,32位,64位。

对应有符号整数:int8,int16,int32,int64。

对应无符号整数:uint8,uint16,uint32,uint64。

计算最大数和最小数规则:

  • 有符号整数:由于有符号,因此位数的最高位被用来存储符号,其他为存储数据值,所以对于n位数来说,取值范围是:-2^(n-1)^~2^(n-1)^-1,对应int8来说,就是 -127 ~ 127。
  • 无符号正数:不需要用最高位记录符号,全部位数表示数字。取值范围是:0 ~ 2^n^-1。对于int8来说,就是0 ~ 255。

特殊的整数类型

intuint以及uintptr

intuint根据特定的平台,其大小与原生的整数相同或者是该平台上运算效率最高的值。要么同时是64位,要么同时是32位,但也不能假定他们就是64位或者32位的整型。即使在一样的硬件下,不同编译器也有可能选用不同的大小。

至于uintptr,它的大小并不明确。但它肯定足够容纳一个指针的大小。常用于底层编程

虽然intuint的长度可能与int32int64..其他整型相同但是他们是不同的类型。

如果想确定intuint的大小

fmt.Println(runtime.GoARCH)		// 看看CPU型号
fmt.Println(strconv.IntSize)	// 这才是int的大小,上面只是提供一个对照

溢出

不论是有符号数还是无符号数,若计算结果所需的位超出类型的范围,就称为溢出。溢出的高位会被无提示地抛弃。

var i int8 = -128
fmt.Println(i-1)	// 127
var i2 int8 = 127
fmt.Println(i2+1)	// -128
var u uint8 = 0
fmt.Println(u-1)	// 255
var u2 uint8 = 255
fmt.Println(u2+1)	// 0

浮点数

float32float64。遵循IEEE 754标准。

math.MaxFloat32给出了float32类型的最大值:3.4028234663852886e+38

math.MaxFloat64则是float64类型的最大值:1.7976931348623157e+308

浮点数可以用来表示小数。

十进制下,float32有效位大约是6位。float64有效位大约是15位。

浮点数的打印可以使用:

  • %g,保留足够的精度显示
  • %e,使用指数形式显示
  • %f,使用无指数形式显示
f := 2.71828
fmt.Printf("%g, %[1]e, %[1]f \n", f)	// 2.71828, 2.718280e+00, 2.718280

复数

complex64complex128 ,二者分别由float32float64组成。

使用real函数提取复数的实部,使用imag函数提取复数的虚部。

浮点数或者整数后面加i就会变成一个虚数,且它的实部为0

x := 1+2i
y := 3+4i

布尔值

bool类型就是布尔值,有true(真)和false(假)两个值。

布尔值无法隐式转换成数值,数值也不能转成布尔值。

它的零值是false

一元操作符!表示逻辑取反。!true表示false

字符串

string表示字符串。它是不可变的字节序列。Go中的字符串内部实现用UTF-8编码。

字符串的“长度”与遍历字符串的做法

字符串的“长度”

对字符串调用len函数,获取到的不是字符串的长度(字符的个数),而是字符串的字节数(字节切片的长度)。

如下,尽管字符个数只有6,但字节长度len(s)却有18,这是因为中文字符以UTF-8存储,通常包含3~4个字节。

s := "中文字节数多"
fmt.Println("len: ", len(s))	// len:  18

对字符串使用下标索引操作,会返回对应索引的字节,而不是字符。

s := "中文字节数多"
fmt.Println("len: ", len(s))	// len:  18
for i :=0; i < len(s); i++ {
    fmt.Printf("%d, %[1]c, %[1]T\n",s[i])
}

对应的输出如下:

len: 18
228, ä, uint8
184, ¸, uint8
173, ­, uint8
230, æ, uint8
150, �, uint8
135, �, uint8
229, å, uint8
173, ­, uint8
151, �, uint8
232, è, uint8
138, �, uint8
130, �, uint8
230, æ, uint8
149, �, uint8
176, °, uint8
229, å, uint8
164, ¤, uint8
154, �, uint8

因此不要随便乱用字符串的下标操作,否则可能获得有意想不到的结果。

遍历字符串

由上面的下标操作可以看出,对字符串的下标索引操作会获得单个字节而不是字符,假如现在我们想处理的是UTF-8解码的字符的话,有两种方式,基本思路都是处理成rune类型:

第一种,用UTF-8解码器显式处理这些字符,unicode/utf8包示例。

utf8.RuneCountInString(s)返回字符串转为rune后的个数,Go使用rune代表一个UTF-8字符。

utf8.utf8.DecodeRuneInString(s[i:])处理当前字符串,并算出下一个rune以及它所占的字节数。

s := "What? 中文字节数多"
runeCount := utf8.RuneCountInString(s)
fmt.Println("runeCount:", runeCount)	// runeCount: 12
for i:= 0; i<len(s); {
	r, size:= utf8.DecodeRuneInString(s[i:])
	fmt.Printf("i: %d, r:%q, type:%T \n", i, r, r)
	i += size
}

输出如下:

runeCount: 12
i: 0, r:'W', type:int32
i: 1, r:'h', type:int32
i: 2, r:'a', type:int32
i: 3, r:'t', type:int32
i: 4, r:'?', type:int32
i: 5, r:' ', type:int32
i: 6, r:'中', type:int32
i: 9, r:'文', type:int32
i: 12, r:'字', type:int32
i: 15, r:'节', type:int32
i: 18, r:'数', type:int32
i: 21, r:'多', type:int32

第二种,用range循环,Go会隐式的进行UTF-8解码。

注意,这里的i,指的是字节的下标,而不是字符的下标。

s := "What? 中文字节数多"
for i, r := range s {
    fmt.Printf("i: %d, rune: %q, type: %T \n", i, r, r)
}

输出如下:

i: 0, rune: 'W', type: int32
i: 1, rune: 'h', type: int32
i: 2, rune: 'a', type: int32
i: 3, rune: 't', type: int32
i: 4, rune: '?', type: int32
i: 5, rune: ' ', type: int32
i: 6, rune: '中', type: int32
i: 9, rune: '文', type: int32
i: 12, rune: '字', type: int32
i: 15, rune: '节', type: int32
i: 18, rune: '数', type: int32
i: 21, rune: '多', type: int32

Rune与Byte(字节)

int32的别名是rune,天然适合存储单个文字符号,为Go所采用的。

rune类型值代表一个UTF-8字符。以字节(byte)为单位对Unicode码点作变长编码。现在计算机都用UTF-8来表示单个字符。

字符串的是由“字符”组成的,字符用单引号包裹起来,如:

var b = 'h'
c := '冲'
fmt.Printf("%d, %q \n", b, b)	// 104, 'h'
fmt.Printf("%d, %q \n", c, c)	// 20914, '冲'

字节,byte类型,底层类型是uint8,由8个bit组成,它可以代表一个ASCII码。ASCII码是满足早期计算机的使用的,它用7位表示128个“字符”(ASCII字符):大小写英文字母、数字、标点符号和设备控制符。

字符串与字节slice的转换

字符串底层是一个字节数组,所以可以和[]byte类型互换。

s := "abc"
b := []byte(s)
s2 := string(b)

概念上,[]byte(s)转换操作会分配新的字节数组,拷贝填入s含有的字节,并生成一个slice的引用,指向整个数组。反之,用string(b)也会产生一份副本而不是操作真正的b,以此保证上面s2不变。

字符串不可变

字符串是不可变的,表现在其字符串值不可修改。平时我们看到的字符串修改操作、拼接操作并不改变原有的字符串值,而是将操作后生成新的字符串值赋予原来的变量。

s := "left foot"
t := s
s += ", right foot"

尽管字符串创建后,它底层的字节slice不可变,但是普通的字节slice是可以随意改变的。

var a = []byte{'h', 'e', 'l', 'l', 'o'}
fmt.Printf("%p, %[1]q \n", a)	// 0xc00000a098, "hello"
a[4] = ' '
fmt.Printf("%p, %[1]q \n", a)	// 0xc00000a098, "hell "

由于字符串的不可变以及避免频繁的操作字符串而导致的多次内存分配和复制,可以使用bytes.Buffer类型。

见GOPL的一个例子:

func intsToString(values []int) string {
	var buf bytes.Buffer
	buf.WriteByte('[')
	for i, v := range values {
		if i > 0 {
			buf.WriteString(",")
		}
		fmt.Fprintf(&buf, "%d", v)
	}
	buf.WriteByte(']')
	return buf.String()
}
func main() {
	fmt.Println(intsToString([]int{1, 2, 3})) // [1,2,3]
}

追加ASCII字符可以用writeByte,追加UTF-8编码的文字符号,最好用WriteRune方法。

基本类型的值都是可比较的

基本类型的值都是可比较的,如布尔值、数值、字符串等。

数值的类型转换

很多整型—整型的转换不会引起值的变化,仅告知编译器如何解读这么值。但缩减大小的类型转换,以及整型与浮点型的相互转换,会因此值的改变或者损失精度。

浮点型转整型会舍弃小数部分并向0取整。

var f = 3.526
i := int(f)
fmt.Printf("f: %v, i: %v \n", f, i) // f: 3.526, i: 3 
var i16 = int16(555)
var i8 = int8(i16)
fmt.Printf("i16: %v, i8: %v \n", i16, i8) // i16: 555, i8: 43 

运算符

运算符降序排列:

* 	/ 	% 	<< 	>> 	& 	&^
+ 	- 	| 	^
==	!=	<	<=	>	>=
&&
||

二元运算符分为五大优先级。同级别的运算符满足左结合律,可以用圆括号指定次序。

常量

常量是一种表达式,保证在编译阶段就计算出对应的值。所有常量本质上都属于基本类型:布尔型、字符串或者数字。

常量自编译后,其值恒定不变。

type Integer int
const I Integer = 10
const S string = "important_secret"
const (
	NUM1 = 1
	NUM2 = 2
	NUM3
	NUM4 = 5.5
	STR1 = "STR1"
)
func main() {
	fmt.Printf("I: %v \n", I)
	fmt.Printf("S: %v \n", S)
	fmt.Printf("NUM1: %v \n", NUM1)
	fmt.Printf("NUM2: %v \n", NUM2)
	fmt.Printf("NUM3: %v \n", NUM3)
	fmt.Printf("NUM4: %v \n", NUM4)
	fmt.Printf("STR1: %v \n", STR1)
}

输出如下:

I: 10
S: important_secret
NUM1: 1
NUM2: 2
NUM3: 2
NUM4: 5.5
STR1: STR1

以上就是go语言中基本数据类型及应用快速了解的详细内容,更多关于go基本数据类型的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: go语言中基本数据类型及应用快速了解

本文链接: https://lsjlt.com/news/164699.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • go语言中基本数据类型及应用快速了解
    目录整数特殊的整数类型如果想确定int和uint的大小溢出浮点数复数布尔值字符串字符串的“长度”与遍历字符串的做法字符串的“长度”遍历...
    99+
    2024-04-02
  • Go语言特点及基本数据类型使用详解
    目录一、Golang 简介1.Go 语言的特点2.Golang 的变量作用域3.Golang 执行流程的两种方式二、Golang 的基本操作1.在 Linux 上安装 Golang ...
    99+
    2024-04-02
  • Go语言数据类型详解:基本数据类型概述
    go 语言提供了以下基本数据类型:bool:布尔型int:有符号整数uint:无符号整数float:浮点数complex:复数型byte:字符型string:字符串 Go 语言数据类型...
    99+
    2024-04-03
    数据类型 go语言
  • Go语言特点及基本数据类型怎么使用
    这篇文章主要介绍“Go语言特点及基本数据类型怎么使用”,在日常操作中,相信很多人在Go语言特点及基本数据类型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言特点及基本数据类型怎么使用”的疑惑有所...
    99+
    2023-06-29
  • 详解Go语言中的数据类型及类型转换
    目录1、基本数据类型2、基础数据类型转换3、基本数据类型转为字符串4、strconv的使用5、字符串转为基础类型1、基本数据类型 数据类型有很多,先研究一下基础的,例如:布尔型、数字...
    99+
    2024-04-02
  • Go语言中基本数据类型的相互转换详解
    目录基本数据类型的相互转换基本语法小知识基本数据类型和string的转换方法一方法二string和基本数据类型转换基本数据类型的相互转换 Go在不同类型的变量之间赋值时需要显示转换,...
    99+
    2024-04-02
  • GO语言基本数据类型字符串怎么用
    这篇文章主要介绍“GO语言基本数据类型字符串怎么用”,在日常操作中,相信很多人在GO语言基本数据类型字符串怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”GO语言基本数据类型字符串怎么用”的疑惑有所帮助!...
    99+
    2023-06-30
  • Go语言类型详解:基本类型有哪些?
    Go语言类型详解:基本类型有哪些? 作为一门静态类型的编程语言,Go语言中拥有丰富的基本类型,这些类型为程序员提供了灵活性和效率。本文将详细介绍Go语言中常见的基本类型,并附上相应的代...
    99+
    2024-04-02
  • 详解C语言的基本数据类型
    目录1、C语言基本数据类型2、计算机中的单位3、各数据类型的大小及字取值大小总结1、C语言基本数据类型 2、计算机中的单位 3、各数据类型的大小及字取值大小 对于short i...
    99+
    2024-04-02
  • 你真的了解Go语言中的数据类型吗?
    Go语言作为一门静态类型语言,数据类型是其非常重要的组成部分。熟悉Go语言中的数据类型,能够更好地理解和使用该语言。本文将带大家了解Go语言中的常用数据类型。 基本数据类型 Go语言中的基本数据类型包括bool、int、float、comp...
    99+
    2023-07-03
    数据类型 npm 框架
  • Go语言中数据类型的分类及其应用场景有哪些?
    作为一门静态类型语言,Go语言中的数据类型非常重要。在Go语言中,所有的数据都是以某种数据类型存在的。在本文中,我们将会介绍Go语言中数据类型的分类以及它们的应用场景。同时,我们也会穿插一些演示代码,帮助你更好地理解这些概念。 一、Go语...
    99+
    2023-08-05
    对象 接口 数据类型
  • 详解Python开发语言中的基本数据类型
    目录1.Python的基本数据类型2.整数类型的概念以及使用2.1.整数类型的概念2.2.使用Python操作整数类型3.浮点数类型的概念以及使用4.布尔类型的概念以及使用1.Pyt...
    99+
    2024-04-02
  • 了解Go语言中Windows数据类型和关键字的基础知识。
    Go语言是一门高效、可靠、简单的编程语言。它是一种编译型语言,旨在提供快速的编译速度和高效的执行速度。Go语言提供了跨平台的支持,包括Windows操作系统。本文将为大家介绍在Go语言中Windows数据类型和关键字的基础知识。 一、Win...
    99+
    2023-09-12
    windows 数据类型 关键字
  • Go语言中的基础数据类型使用实例
    目录前言基础数据类型整型有符号整型无符号整型特殊整型浮点型复数布尔值字符串字符串的转义符多行字符串常用的操作字符串的手段byte和rune类型修改字符串类型转换小结前言 任何语言都...
    99+
    2023-05-14
    Go 基础数据类型 Go 数据类型
  • Go语言中的基础数据类型如何使用
    这篇文章主要介绍了Go语言中的基础数据类型如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的基础数据类型如何使用文章都会有所收获,下面我们一起来看看吧。基础数据类型整型在Go中整型数据类型主要分...
    99+
    2023-07-05
  • 重学Go语言之基础数据类型详解
    目录前言布尔型数字类型整型浮点型复数字符串小结前言 Go语言有非常强大的数据类型系统,其支持的数据类型大体上可分为四类:基础数据类型、引用数据类型、接口类型、复合类型。 基础数据类型...
    99+
    2023-02-28
    Go语言基础数据类型 Go语言数据类型 Go 数据类型
  • 深入了解Go语言不同的数据类型
    了解Go语言中不同的数据类型,需要具体代码示例 Go语言作为一种静态类型的编程语言,拥有丰富的数据类型,包括基本数据类型和复合数据类型。掌握不同数据类型的特点和使用方法,对于编写高效、准确的程序至关重要。下面...
    99+
    2024-01-13
  • Go语言的数据类型详解
    标题:Go语言的数据类型详解 在Go语言中,数据类型是非常重要的概念。Go语言提供了丰富的数据类型,包括基本数据类型、复合数据类型和自定义数据类型。本文将详细介绍Go语言中常用的数据类...
    99+
    2024-03-04
    数据类型 go语言 详解 键值对
  • Go语言中的复数类型及其用法详解
    go语言中的复数类型为complex128,可表示具有实部和虚部的数字,通过complex(实部,虚部)声明;复数支持加减乘除运算、通过重载运算符实现;complex包提供real、im...
    99+
    2024-04-03
    go语言 复数类型
  • 学习Go语言的基础知识:从快速掌握基本语法到应用
    Go语言入门指南:快速掌握基本语法和应用 Go语言(又称Golang)是一种开源的编程语言,由谷歌开发。它以其简洁、高效和并发性而著称,在云计算、网络编程、系统编程等领域得到了广泛的应用。 1. 基本语法 1...
    99+
    2024-01-31
    go语言 入门指南 基本语法 网络编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作