(七)golang-变量之基本数据类型(看这篇就够了)
1.整数类型
| 类型 | 有无符号 | 占用存储空间 | 表示范围 | 备注 |
| int8 | 有 | 1字节 | -2**7~2**7-1 | |
| int16 | 有 | 2字节 | -2**15~2**15-1 | |
| int32 | 有 | 4字节 | -2**31~2**31-1 | |
| int64 | 有 | 8,字节 | -2**63~2**63-1 | |
| uint8 | 无 | 1字节 | 0~2**8-1 | |
| uint16 | 无 | 2字节 | 0~2**16-1 | |
| uint32 | 无 | 4字节 | 0~2**32-1 | |
| uint64 | 无 | 8字节 | 0~2**64-1 | |
| int | 有 |
32位系统4字节 64位系统8字节 |
-2**31~2**31-1 -2**63~2**63-1 |
|
| uint | 无 |
32位系统4字节 64位系统8字节 |
0~2**32-1 0~2**64-1 |
|
| rune | 有 | 与int32一样 | -2**31~2**31-1 |
等价int32,表示 一个unicode码 |
| byte | 无 | 与uint8一样 | 0~2**8-1 |
当要存储字符时 使用byte |
整型的使用细节:
(1)golang整数类型分为:有符号和无符号,int和uint的大小和系统有关;
(2)golang整型默认申明为int;
(3)如何在程序查看某个变量的数据类型?
package main import (
"fmt"
"unsafe"
) func main() {
var num int64 = 10
fmt.Printf("num的数据类型是 %T,占的字节数是 %d", num, unsafe.Sizeof(num))
}

(4)golang使用整数类型时,遵从保小不保大原则,即在保证程序正常运行的情况下,尽量使用占用空间小的数据类型;
(5)bit:计算机中最小的存储单位,byte:计算机中基本的存储单元;
2.浮点类型
| 类型 | 占用存储空间 | 表示范围 |
| 单精度float32 | 4字节 | -3.403E38~3.403E38 |
| 双精度float64 | 8字节 | -1.798E308~1.798E308 |
说明:
(1)浮点数在机器中存在的形式:浮点数=符号位+指数位+尾数位(浮点数都是有符号的)11110000111.111111111111111111000
(2)尾数部分可能丢失,造成精度损失;
(3)浮点型的存储分为三个部分:符号位+指数位+尾数位;
浮点型的使用细节:
(1)golang浮点类型有固定的范围和字段长度,不受操作系统的影响;
(2)默认为float64类别;
(3)浮点型常用两种形式表示:
1)十进制:5.12、.512
2)科学记数法形式:5.1234E2、5.1234E-2
(4)通常使用float64,它精度更高;
3.字符类型
字符串是一串固定长度的字符连接起来的字符序列。golang没有专门的存储字符类型,如果要存储单个字符,用byte来保存。go的字符串是由单个字节连接起来的,它与传统的字符串是由字符组成的不同。
package main import (
"fmt"
) func main() {
var c1 byte = 'a'
fmt.Println(c1)
}
当我们直接输出字符c1,,得到的是它的ascII值:97。要用格式化输出:fmt.Printf("%c",c1)。而当我们要存储中文时,此时不能够用byte类型了,即ASCII值大于255时,会显示溢出,我们要用int来存储:
(补:格式化输出代表含义 %d:输出整型;%f:输出浮点型;%c:输出字符型;%v:输出原变量值;%T:输出变量的数据类型;%t:输出布尔值:%q:输出带双引号的字符串)
package main import (
"fmt"
) func main() {
var c1 byte = 'a'
var c2 int = '被'
fmt.Println(c1)
fmt.Printf("c1的值是:%c \n", c1)
fmt.Printf("c2的值是:%c,它的ASCii值是:%d", c2, c2)
}

字符类型使用细节:(再也不用担忧编码的问题了,所有的编码都是utf-8)
(1)字符常量使用单引号括起来的单个字符;
(2)go中允许使用转义字符'\'来将其后的字符转变为特殊字符型常量,例如 var c int = '\n';
(3)字符使用utf-8编码;
(4)go中,字符的本质是一个整数,直接输出时,会输出它对应的UTF-8编码的值;
(5)可以直接给变量赋予某个数字,然后格式化输出%c,会输出该数字对应的unicode字符;
(6)字符类型是可以进行运算的,相当于一个整数,因为它都对应unicode码;
4.布尔类型
只允许取两个值:true、false;占用1个字节;主要用在逻辑运算;
5.字符串类型
go的字符串是由字节连接而成;
package main import (
"fmt"
) func main() {
var address string = "北京长城"
fmt.Println(address)
}
字符串的使用细节:
(1)go语言的字符串的字节使用utf-8编码;
(2)与python一样,一旦字符串赋值了,就不能被更改;
(3)两种表示形式
1)双引号,会识别转义字符;
2)反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击,输出源代码等
package main import (
"fmt"
) func main() {
var c = "abc\nabc"
var d = `abc\nabc`
fmt.Println(c)
fmt.Println(d)
}

3)字符串的拼接,当我们要拼接多行字符串时,要将加号留在每行末尾:(注意单个字符进行拼接是指对unicode值进行相加)
package main import (
"fmt"
) func main() {
var str = "hello " + "world " +
"!"
fmt.Println(str)
}

6.基本数据类型的默认值
整型:0
浮点型:0
字符串:""
布尔类型:false
7.基本数据类型之间的转换
golang和java、c不同,Go在不同类型变量之间赋值需要显示转换,也就是golang中数据类型不能自动转换;
基本语法:T(v),即将变量v转换成T数据类型
整数型之间的转换:例如var i int8 = 10; var n1 int64 = int64(i)
(1)数据类型转换可以从范围小-->范围大,范围大-->范围小;
(2)被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化;
(3)在转换中,比如将int64转成int8,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样;
基本数据类型和string之间的转换
(1)fmt.Sprintf("%参数",表达式):参数和表达式的类型要匹配;结果返回转换后的字符串;

(2)使用strconv函数package main
import (
"fmt"
"strconv"
) func main() {
var num1 int = 99
var num2 float64 = 23.456
var b bool = false
//FormatInt()第一个参数必须转成int64,第二个是十进制表示
var str1 = strconv.FormatInt(int64(num1), 10)
//FormatFloat,'f'表示格式,10表示保留小数,64表示float64
var str2 = strconv.FormatFloat(num2, 'f', 10, 64)
var str3 = strconv.FormatBool(b)
fmt.Printf("%T--%q\n", str1, str1)
fmt.Printf("%T--%q\n", str2, str2)
fmt.Printf("%T--%q\n", str3, str3)
fmt.Printf("%T--%q\n", str4, str4)
}

string和基本数据类型转换:
package main import (
"fmt"
"strconv"
) func main() {
var s1 string = "true"
var s2 string = ""
var s3 string = "23.45"
var num1 int64
var num2 float64
var b bool
b, _ = strconv.ParseBool(s1)
num1, _ = strconv.ParseInt(s2, 10, 64)
num2, _ = strconv.ParseFloat(s3, 64)
fmt.Printf("%T--%t\n", b, b)
fmt.Printf("%T--%d\n", num1, num1)
fmt.Printf("%T--%f\n", num2, num2)
}

注意:要确保string类型要能够转换成有效的数据,即"hello"不能转换成布尔值、整型、浮点型
(七)golang-变量之基本数据类型(看这篇就够了)的更多相关文章
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...
- [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
- Vue学习看这篇就够
Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...
- Pycharm新手教程,只需要看这篇就够了
pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了
.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
- 想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!
想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了! 很多通信系统发展到某种程度都会有小型化的趋势.一方面小型化可以让系统更加轻便和有效,另一方面,日益发展的IC**技术可以用更低的成本生产 ...
随机推荐
- 设计时数据源: 在ActiveReports中直接连接PostgreSql 数据库
在之前的博客中,我们学习了如何在运行时绑定PostgreSql 数据库,今天我们学习,如何直连PostgreSQL 数据库. 1. 安装PostgreSQL 的ODBC驱动程序 https://www ...
- 一步一步剖析Dictionary实现原理
本文是对c#中Dictionary内部实现原理进行简单的剖析.如有表述错误,欢迎指正. 主要对照源码来解析,目前对照源码的版本是.Net Framwork 4.8,源码地址. 1. 关键的字段和Ent ...
- Github配合Jenkins,实现vue等前端项目的自动构建与发布
本篇文章前端项目以vue为例(其实前端工程化项目的操作方法都相同),部署在Linux系统上(centos). 之前做前端项目的部署,一直都是手动运行打包命令,打包完.再使用FTP.Xshell等这类的 ...
- Linux下格式化恢复USB启动优盘
问题描述:优盘制作成启动盘安装操作系统,但是后边使用时发现无法格式化,提示 This partition cannot be modified because it contains a partit ...
- e课表项目第二次冲刺周期第五天
昨天干了什么? 昨天,我们组商量了主界面的主要设计,然后我查找了相关的资料,将主界面改成了一个连接数据库,并将数据库中的数据进行显示.接着,又在网上搜了一些资料,为数据建立了一个布局,能够显示该数据的 ...
- BZOJ [Scoi2015]情报传递
Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头日外其余n-1名情报员有且仅有1名上线.奈 ...
- System NT Kernel & System占用CPU 12%左右 终极解决方案,原来是更新惹的祸
任务管理器发现 system进程持续占用12%左右的cpu,网上搜索到的很多方法均无效 误打误撞发现了这个方法,亲测可用 卸载系统补丁(KB41000347),提升10%的cpu性能 卸载补丁前: ...
- Spring Security 入门(一)
当你看到这篇文章时,我猜你肯定是碰到令人苦恼的问题了,我希望本文能让你有所收获. 本人几个月前还是 Spring 小白,几个月走来,看了 Spring,Spring boot,到这次的 Spring ...
- Lombok中关于@Data的使用
当你在使用 Lombok 的 @Data 注解时,其实会有一些坑需要关注,今天就让我们来见识一下. Lombok 先来简单介绍一下 Lombok ,其官方介绍如下: Project Lombok ma ...
- 数据挖掘:关联规则的apriori算法在weka的源码分析
相对于机器学习,关联规则的apriori算法更偏向于数据挖掘. 1) 测试文档中调用weka的关联规则apriori算法,如下 try { File file = new File("F:\ ...