Go_数据类型

数据类型:

计算机存储设备最小信息单位是位(bit),最小的存储单元是字节(byte),占用字节的不同,所表示能存储的数据长度不同。数据类型用来说明数据的数据的结构,便于后面定义变量、参数传递等。

基本数据类型:

类型默认值
整型0
浮点型0.0
字符串“”
布尔类型false

派生数据类型:

派生数据类型就是由基础数据类型演变而来的

  • 指针、数组、结构体、channel、函数、切片、接口、Map

数据类型说明:

1KB=1024B,1MB=1024KB,1G=1024MB

类型有无符号名称占用字节说明
bool布尔类型1只有true或false,默认是false
byte字节型1等价于uint8,当要存储字符的时候可以byte
rune字符类型4专用于存储unicode编码,等价于uint32
int整型4或832位系统4个字节 64位系统8个字节int占用多大取决于操作系统
uint整型4或832位系统4个字节 64位系统8个字节
int8整型1-128 ~ 127
int16整型2-32768 ~ 32767
int32整型4-2147483648 ~ 2147483647
int64整型8-9223372036854775808 ~ 9223372036854775807
uint8整型10 ~ 255
uint16整型20 ~ 65535
uint32整型40 ~ 4294967295(42亿)
uint64整型80 ~ 18446744073709551615
float32浮点型4小数位精确到7位
float64浮点型8小数位精确到15位
complex64复数类型832 位实数和虚数
complex128复数类型1664 位实数和虚数
uintptr整型4或8无符号整型,⾜以存储指针的uint32或uint64整数
string字符串utf-8字符串

占用字节数不同有什么区别:

数据类型占用不同的字节所表示的存储空间大小不同

有符号和无符号的区别:

有符号的,长度第一位会存类型,剩余的长度才是数据。无符号的全部都可以存数据。前面有u就是无符号,没有u就是有符号

有符号和无符号如何选择:

如果只存整数就使用无符号的,因为范围更大,如果存的有负数就用有符号的。
能用小的就不要选择大的,比如年龄就用byte(0 ~ 255)

查看变量的数据类型:

	fmt.Printf("%T", 变量名)

查看变量占用的字节大小:

	fmt.Printf("%d", unsafe.Sizeof(num))//  unsafe.Sizeof(num):返回指定变量占用的字节数

基本数据类型和引用类型区别:

基本数据类型:int、float、bool、string、数组、结构体
引用类型:指针、切片、map、管道、接口

区别:

基本数据类型的变量是直接存数据的,通常在栈中分配的
引用数据类型的变量是存的对象(内存地址),这个变量分配的空间才是存数据的,通常在堆中分配的。当没有引用变量的时候,会由GC回收变成垃圾

整型:

演示:

func main() {var age uint = -10 // 报错,不支持负数fmt.Println(age)  var b byte = 1var r rune = 2fmt.Printf("数据类型是:%T,%T", b, r) //uint8,int32
}

浮点类型:

  • 关于数学运算的包里默认都是用的float64,日常使用也尽量使用float64的就行了
  • 浮点数可能会造成精度损失,64位的要比32位的更精准

演示:

func main() {var num float64 = 123.456789num2 := 123.456789        // 自动推导方式定义变量默认是float64类型fmt.Printf("%f\n", num)   //123.456789fmt.Printf("%.2f\n", num) // 使用".数字"可以保留小数位数并四舍五入  123.46fmt.Printf("%T", num2)
}

布尔类型:

  • 布尔类型也叫bool类型,布尔类型的取值要么是true,要么是false
  • bool适合做逻辑运算,一般用在流程控制语句里
  • 使用bool关键字进行定义,默认值为false
func main() {var result boolfmt.Println(result) // falseresult = true //修改默认值fmt.Printf("%t", result) //true
}

字符类型:

  • 字符就是用’单引号’括起来的数据,在Go中没有char类型,如果要存储单个字符,一般使用byte保存。
  • 字符可以使用Go转义字符修饰数据
  • 如果需要保存的变量值大于255时使用byte会溢出,可以使用int代替byte保存数据
  • Go语言的字符使用的是UTF-8编码标识Unicode文本,所以Go统一使用了UTF-8没有乱码的问题出现
  • 字符的本质也是一个整数,直接输出的时候是按照对应的UTF-8编码的码值运算的,所以字符可以参与运算。
  • 字符变量赋值后,通过%c可以打印出该数字对应的unicode字符
    点击查看ASCLL码表

演示:

func main() {var b byte = 'a'var b byte = '我' // 报错,一个汉字占用3个字节,数据溢出fmt.Println("b=", b)  // Println打印结果不是a,是97,a=97是ASCLL码表对应值fmt.Printf("%c\n", b) // 使用%c可以打印出具体存储的字符var a int = 'b' // 也可以使用int类型定义fmt.Println("a=", a) // 98fmt.Printf("%c\n", a)
}

字符串类型:

  • "双引号"内的数据称为字符串,本质是一串固定长度字符连接起来的字符序列,但是在Golang里是由单个字节(byte)连接起来的
  • 字符串中有一个隐藏的结束标志\0, \0是字符串的结束符,任何字符串末尾都会自动加上\0
  • 字符串一旦赋值就不能修改了,字符串是不可变的
  • 字符可以使用Go转义字符修饰数据
  • 反引号以字符串的原生形式输出,在反引号里的内容全部都是普通文本,包括换行和特殊字符,可以实现防止攻击、输入源代码的效果
func main() {var name string = "itzhuzhu哈哈嘿嘿"fmt.Printf("%T\n", name)                  // 打印字符串的数据类型fmt.Println("name=", name)                // 打印字符串的数据值fmt.Println("长度为:", len(name))            // 输出为20,len:打印字符串的长度,长度不包含隐藏的\0,把所有的数据转换为字节,如果字符是中文,一个中文是3个字节fmt.Println(utf8.RuneCountInString(name)) // 12   打印的是Unicode码(万国码),中文/英文都算一个字节// 使用反引号会原样输出,编译器不会解析原始字符串内的数据str := `func save() {var age int = 10var a int = 1var b int = avar name stringfmt.Println(age)fmt.Println(name)fmt.Println(a, b)}
`str2 := "嘻嘻"str += "可以再次拼接字符串,也可以和其它字符串变量一起拼接" + str2fmt.Println("str=", str)
}

在golang中做字符串拼接的时候如果需要换行,需要把加号放在上一行,否则会报错
在这里插入图片描述

允许以索引号访问字节数组(并非字符),但不能获取数组元素地址

func main() {s := "abc"println(s[1])println(&s[1]) // 错误: cannot take the address of s[1]
}

使用for遍历字符串时,分byte和rune两种方式

func main() {s := "itzhuzhu"for i := 0; i < len(s); i++ { // byte,返回的是ASCLL码fmt.Printf("%d: [%c]\n", i, s[i])}fmt.Println("-------------------")for i, c := range s { // rune,返回数组索引号,以及Unicode字符fmt.Printf("%d: [%c]\n", i, c)}
}

引用类型:

  • Go的引用类型特指指针、slice、map、channel、interface,相比数字、数组等类型,引用类型拥有更复杂的存储结构。除分配内存外,它们还需初始化一系列属性,诸如指针、长度,甚至包括哈希分布、数据队列等。
  • 内置函数new依指定类型数据长度分配内存,返回指针。而引用类型则必须使用make函数创建,编译器将make转换为目标类型专用创建函数(或指令),以完成内存分配和属性初始化。

以切片语法(起始和结束索引号)返回子串时,其内部依旧指向原字节数组

func main() {s := "abcdefg"s1 := s[:3]  // 从头开始,仅指定结束索引位置s2 := s[1:4] // 指定开始和结束位置,返回[start, end)s3 := s[2:]  // 指定开始位置,返回后面全部内容println(s1, s2, s3)// reflect.StringHeader 和 string 头结构相同。// unsafe.Pointer用于指针类型转换。fmt.Printf("%#v\n", (*reflect.StringHeader)(unsafe.Pointer(&s)))fmt.Printf("%#v\n", (*reflect.StringHeader)(unsafe.Pointer(&s1)))
}

StringHeader源码

type StringHeader struct {Data uintptr	// 存放指针,指向的是原数组Len  int		// 字符串的长度
}

函数参数传递方式:

**值类型:**基本数据类型、数组、struct

**引用类型:**指针、slice、map、channel、interface

值类型参数默认就是值传递,而引用类型参数默认就是引用传递,其实,不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是拷贝的地址,一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。

传递解析:

值类型默认就是值传递:变量直接存储值,内存通常在栈中分配

var name = "itzhuzhu" // func test(name string){}// 这里传递的name就是值传递,传过来的是"itzhuzhu"

引用类型默认就是引用传递:变量直接存储的是一个地址,这个地址中存的才是值,内存通常在堆中分配,当没有任何变量引用这地址时就会被GC回收

var name = "itzhuzhu" // func test(&name string){}// 这里传递的就是name的内存地址,地址中存的才是"itzhuzhu"

类型别名:

类型别名相当于给数据类型起了个外号,下面两种格式都可以用

Go1.9版本前定义格式

type 类型别名 类型

Go1.9版本后定义格式

type 类型别名 = 类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HashMap之扰动函数和低位掩码

我们都知道&#xff0c;hashMap在实现的时候&#xff0c;为了寻找在数组上的位置&#xff0c;主要做了两件事 int hash hash(key); int i indexFor(key, table.length); 这个时候得到i才是数组上的位置。 这两个方法详解如下 JDK8对扰动函数的修改&#xff0c;只进行了一次移…

NE2018届校招内推笔试——数据挖掘

【单选题|2分/题】 1、在只有两类的情况下&#xff0c;二维特征向量通过共享相同的协方差矩阵的正态分布生成&#xff0c;其中协方差矩阵为&#xff1a; 均值向量分别为&#xff1a;&#xff0c;则根据贝叶斯分类&#xff0c;样本分类为&#xff1a;&#xff08;&#xff09; A…

不满足依赖关系

今晚上脑残&#xff0c;替换了实体&#xff0c;把报错的也都替换完成了&#xff0c;但是运行报错&#xff1a; 大概的意思就是说不满足XXXXXX依赖关系&#xff0c;但是找了半天都没有找到&#xff0c;最后是mapper的实体类全路径替换的时候&#xff0c;脑残在后面加上了.java。…

Go_切片(初始化、遍历、截取、修改、append、copy、切片作为函数参数、切片求和、切片求最大值)

切片&#xff1a; 切片的长度是不固定的&#xff0c;可以追加数据&#xff0c;可以理解是一个动态数组&#xff0c;切片的底层是一个结构体切片类型&#xff08;slice&#xff09;本身并不是动态数组或数组指针。它内部通过指针引用底层数组&#xff0c;设定相关属性将操作限定…

阿里巴巴Java开发手册——速读记录

本随笔基于阿里巴巴Java开发手册V1.2&#xff0c;陆陆续续记录一些现阶段能理解的&#xff0c;有启发的内容&#xff0c;并将持续更新 最佳实践——插件使用已经发布为随笔&#xff01;http://www.cnblogs.com/jiangbei/p/7668654.html 一、编程规范 1.命名规范 &#xff08;1&…

Go_指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

指针&#xff1a; 指针是一个特殊的变量&#xff0c;因为它存储的数据是另一个变量的内存地址&#xff0c;指针本身也是有内存地址的指针的数据类型有int、float、bool、string、数组、结构体指针的作用就是可以通过变量/对象的内存地址去操作变量/对象 注意&#xff1a; 取址运…

Go_面向对象(抽象、封装、继承)

抽象 抽象是一种编程思维方式&#xff0c;是从多个事物中提取共性 例&#xff1a;产品经理和程序员都有工作的方法&#xff0c;但是工作内容不同&#xff0c;可以把工作抽象出来定义为一个方法&#xff0c;具体细节由调用者补充 银行存取款案例&#xff1a; 账号结构体取款方法…

Discrete Logging POJ - 2417(BSGS)

Discrete Logging POJ - 2417 题意&#xff1a;给P&#xff0c;B&#xff0c;N&#xff0c;求最小的L使得 BL≡N (mod P)&#xff0c;其中P是素数。 Baby Step Giant Step 1 #include <cstdio>2 #include <cstring>3 #include <iostream>4 #include <cma…

js 根据固定位置获取经纬度--腾讯地图

1.首先引入jq 和 腾讯地图js <script src"../js/jQuery.js"></script> <script charset"utf-8" src"http://map.qq.com/api/js?v2.exp"></script> 2.html代码部分 <body onload"init()"><button ty…

Golang——string字符串常用函数(Contains、join、Index、Repeat、Replace、Split、Trim、Fields)

更多的还是去官方文档里去看&#xff1a;https://studygolang.com/pkgdoc Contains&#xff1a; 判断字符串中是否包含指定字符串 演示&#xff1a; func main() {str1 : "itzhuzhu"result : strings.Contains(str1, "zhu")fmt.Println(result) }join&a…

[flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法

一周时间快速阅读了400页的《javascript基础教程》&#xff0c;理解了主要概念。解决了一个很久之前的疑问。 我的网站是使用flask框架搭建的&#xff0c;介绍flask web的一本著名的书&#xff08;之前提到过&#xff09;作者搭建个人博客时&#xff0c;向读者推荐了flask-boot…

Go_关键字、编译、转义字符

关键字&#xff1a; 关键字是指被go语言赋予了特殊含义的单词&#xff0c;共25个&#xff0c;关键字不能用于自定义名字&#xff0c;只能在特定语法结构中使用。 breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstfallthroughifrangetypec…

并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

多线程&#xff1a; 多线程就是同时执行多个应用程序&#xff0c;需要硬件的支持同时执行&#xff1a;不是某个时间段同时&#xff0c;cpu切换的比较快&#xff0c;所有用户会感觉是在同时运行 并发与并行&#xff1a; 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多…

第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到&#xff0c;在init进程中内核挂接到根文件系统之后&#xff0c;会开始启动第一个应用程序: kernel_init函数代码如下: static int __init kernel_init(void * unused) //进入init进程 …

Golang并发——并发技术Goroutine和channel的使用、定时器、生产者消费者、条件变量、select

Goroutine: goroutine是Go并行设计的核心。goroutine说到底其实就是协程&#xff0c;它比线程更小&#xff0c;十几个goroutine可能体现在底层就是五六个线程&#xff0c;Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB)&#x…

Oozie协作框架

Oozie协作框架 一&#xff1a;概述 1.大数据协作框架 2.Hadoop的任务调度 3.Oozie的三大功能 Oozie Workflow jobs Oozie Coordinator jobs Oozie Bundle 4.Oozie的架构 控制流节点 起始&#xff0c;分支&#xff0c;并发&#xff0c;汇合&#xff0c;结束 动作节点action 5.O…

11.4 专利法与反不正当竞争法解读

第六条是对于职务作品的一个定性.它这个职务作品、职务发明创造和我们前面著作法所讲到的职务作品的处理方式基本一致.就是如果认定某一个作品它是属于职务作品、职务发明创造,那么这一个作品它的专利权应该是属于单位而不是个人.只有认定这个创造为非职务发明创造的时候,申请的…

一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP

网络编程三要素&#xff1a;ip地址、端口、协议&#xff0c;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;可以进行数据传输 常见协议&#xff1a; 传输层 常见协议有TCP/UDP协议。应用层 常见的协议有HTTP协议&#xff0c;FTP协议。网络层 常见协议有IP协议…

【Linux笔记(000) 】-- 系统启动过程

索引&#xff1a; 目录索引 一. 启动流程 BIOS --> MBR(Boot Code) --> 引导程序(GRUB) --> 加载内核 --> 执行Init --> runlevel 二. 内容详解 BIOS: Basic Input Output System , 基本输入输出系统 ,负责检查硬件,查找启动设备, 可启动设备在BIOS中定义。…

Golang——TCP、UDP实现并发(服务端与客户端)

Server端常用函数、接口&#xff1a; Listen函数&#xff1a;func Listen(network, address string) (Listener, error)network&#xff1a;选用的协议&#xff1a;TCP、UDP&#xff0c; 如&#xff1a;“tcp”或 “udp”address&#xff1a;IP地址端口号, 如&#xff1a;…