go语言初识——数据类型

news2024/11/15 22:32:05

目录

go

go与C语言区别

helloworld

数据类型

变量

定义

类型推导

简短声明 :=

匿名变量

常量

iota

基本类型

指针

数组

结构体


go

Go是2009年开源的编程语言,Go语言具有以下特性:语法简洁、并发编程、编译迅速、数组安全、丰富的内置类型、错误处理、匿名函数和闭包反射函数多返回值自动垃圾回收

Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,他们最终的目标是设计一种适应网络和多核时代的C语言。所以Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语言”,当然从各种角度看,Go语言确实是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想。但是Go语言更是对C语言最彻底的一次扬弃,它舍弃了C语言中灵活但是危险的指针运算,还重新设计了C语言中部分不太合理运算符的优先级,并在很多细微的地方都做了必要的打磨和改变。

go与C语言区别

  1. 包声明(自说明),编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main

  2. 引入包(头文件),其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包

  3. 函数,和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。

  4. 变量,Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

  5. 语句/表达式,在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。

  6. 注释,和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

需要注意的是:标识符是用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母和数字、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字

  • 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);

  • 标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected)。

helloworld

package main
import "fmt"
func main(){
    fmt.Println("hello world!")
}

程序执行

go build main.go ---> 生成二进制可执行文件

go run main.go ---> 可直接执行


数据类型

在 Go 编程语言中,数据类型用于声明函数和变量。

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。具体分类如下:

类型解释
布尔型布尔型的值只可以是常量 true 或者 false
数字类型整型 int 和浮点型 float。Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码
字符串类型字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本
派生类型指针类型(Pointer)、 数组类型、结构化类型(struct)、Channel类型、函数类型、切片类型、接口类型、Map 类型

变量

定义

定义变量格式为var varname typename 如:定义一个int类型变量

package main
import "fmt"
func main() {
    var a int = 27
    fmt.Println(a)
} 

若变量未进行显式初始化,则为其赋值为空或者0值

  • 数值类型(包括complex64/128)为0

  • 布尔类型为 false

  • 字符串为 “”

  • 以下几种类型零值为nil:

    var a *int    
    var a []int    
    var a map[string] int    
    var a chan int    
    var a func(string) int    
    var a error // error 是接口

类型推导

即进行显式初始化时,可省略变量类型,由编译器判断

var boolvar = true

简短声明 :=

可省去var typename 的类型推导,但必须声明并初始化

格式 varname := something ,如

a := 1

也可以同时初始化多个变量

a, b, c := 1, 2, 3

此用法比之前定义变量更加方便快捷,但有所限制

  • 它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量

    var (
        s1 int  = 1
        s2 bool = true
    )
  • 必须声明并初始化,即:=左侧的varname队列必须有未声明过的变量

    func main()  {//    即:=左侧只要有未声明的变量就可以使用
        var a int = 2
        a, b := 1, "123"
    }

匿名变量

用于占位

匿名变量是一个下画线_,这本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。

使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。

匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用

a, b, _ := 1, "123", 2

常量

常量是在程序运行时不会被修改的量。常量中的数据类型只可以是布尔型数字型(整数型、浮点型和复数)和字符串型

格式:const variable [type] = value

const c, d = 3, "4"

编译时函数使用

可使用内置函数初始化,其在编译时计算

常量可以用len()等内置函数计算表达式的值,在常量表达式中,函数必须是内置函数,否则编译不通过

func main() {
    const (
        a = "123"
        b = len(a)
    )
    fmt.Println(a, b)
}
//123 3

iota

iota为批常量计数(即为一批常量赋值时的计数)

iota是一种特殊常量,可以认为是一个可以被编译器修改的常量。iota在const关键字出现时将被重置为0,const中每新增一行常量声明,iota计数一次。

在批赋值中途,插入新的变量类型,不影响iota的计数

const (
    a, b = iota, iota //iota = 0
    c, d              //iota = 1
    e, f = "1", "2"   //iota = 2
    g, h = iota, iota //iota = 3
)
fmt.Println(a, c, d, e, f, g, h)
//输出  0 1 1 1 2 3 3 0 1

并且,常量的类型推导,是根据赋值来确定的,如果未进行赋值,则以前一行所赋值再次赋值

const (
    a, b = iota, "iota"
    c, d
)
fmt.Println(a, b, c, d)
//0 iota 1 iota

若为如下情况,编译器无法推导e的值,产生错误

const (
    a, b = iota, "iota"
    c, d, e//err
)

使用隐匿变量控制iota的值

func main() {
    const (
        _ = 0
        a = iota
        _
        _
        b = iota
    )
    fmt.Println(a, b)
}
//1 4

单独的常量赋值,认为是单独的一批

func main() {
    const a = iota
    const b = iota
    fmt.Println(a, b)
}
// 0 0

基本类型

类型描述
uint8 / uint16 / uint32 / uint64无符号 8 / 16 / 32 / 64位整型
int8 / int16 / int32 / int64有符号8 / 16 / 32 / 64位整型
float32 / float64IEEE754 32 / 64 位浮点型数
complex64 / complex12832 / 64 位实数和虚数
byte类似 uint8
rune类似 int32
uintptr无符号整型,用于存放一个指针

指针

与C相同,Go语言让程序员决定何时使用指针。变量其实是一种使用方便的占位符,用于引用计算机内存地址。Go 语言中的的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址。

go语言指针的使用类似于引用

指针变量其实就是用于存放某一个对象的内存地址。

func main() {
    var a = 1
    var p = &a
    var p1 *int
    fmt.Println(a, p, p1)
    p1 = p
    fmt.Println(a, p, p1)
}
//1 0xc0000a4000 <nil>
//1 0xc0000a4000 0xc0000a4000

若定义但为赋值,默认为nil(即null)


数组

数组使用与c语言类似

格式var variable_name [SIZE] variable_type

go语言数组可对数组内一下标进行初始化

//声明数组
var ar [3]int
//直接初始化
var arr = [3]int{1} //[1 0 0]
var arr1 = [3]int{1, 1: 2}//[1 2 0]
//使用简短声明进行初始化
brr := [3]int{1, 2}//[1 2 0]
brr1 := [3]int{0: 3, 1: 4}//[3 4 0]
//未知长度是时,使用[...]进行占位
var crr = [...]int{1, 9: 3}//[1 0 0 0 0 0 0 0 0 3]
crr1 := [...]int{1, 2, 3, 4, 5}//[1 2 3 4 5]

数组名

c语言的数组名,代表一个指针,指向数组

go的数组,为一个变量类型,名称即是这个变量

所以go中使用数组名赋值,即是拷贝整个数组,使用指针传递数组减少开销

func main() {
    arr := [...]int{1, 2, 3}
    var brr = arr
    var p = &brr
    fmt.Println(arr)
    fmt.Println(brr)
    fmt.Println(&brr)
    fmt.Println(p)
    fmt.Println(*p)
}

结构体

type Book struct {
	_BookName string
	_Author   string
}

func main() {
	book1 := Book{"红楼梦", "曹雪芹"}
	fmt.Println(book1)

	var book2 = Book{_BookName: "三体", _Author: "刘慈欣"}
	fmt.Println(book2._BookName, book2._Author)
    
    //结构体指针访问时使用 .  而不是->
    p := &book1
	fmt.Println(p._BookName, p._Author)
}
//{红楼梦 曹雪芹}
//三体 刘慈欣
//红楼梦 曹雪芹

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

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

相关文章

如何在 Antd Pro 框架上实现样式自定义?

文章目录一、前言二、实操过程一、前言 Ant Design Pro 是一个企业级中后台前端/设计解决方案&#xff0c;已经有完善的 UI 组件及设计风格&#xff0c;在一些特定项目中&#xff0c;往往涉及到对其调整&#xff0c;来实现独特的 UI 设计&#xff0c;如不同的主题色、布局、卡…

帮助台技术员协助的自助服务

对于帮助台技术员例行电话带来成本高居不下的企业来说&#xff0c;最终用户自助服务是一个伟大的解决方案&#xff0c;允许用户解决自己的IT问题。然而&#xff0c;一些企业仍未部署自助服务。例如&#xff0c;即使在Active Directory中维护每个员工的最新个人资料信息是一件乏…

1. Python3的安装与环境搭建

1. 开发环境&#xff1a;Win10 Python3.10.5 PyCharm 2. 安装Python3 下载地址&#xff1a;https://www.python.org/ 运行刚下载的python-3.10.5-amd64.exe&#xff0c;并做以下操作&#xff1a; 然后Next&#xff0c;并进行以下操作&#xff1a; 最后点击Install&#…

会话跟踪技术:Cookie、Session和Token

会话跟踪技术背景&#xff1a;1. Cookie &#xff08;客户端的会话跟踪技术&#xff09;1.1 原理1.2 基本使用1.2.1 服务器发送Cookie1.2.2 服务器获取Cookie1.3 使用细节1.3.1 存活时间1.3.2 存储中文2. Session&#xff08;服务端的会话跟踪技术&#xff09;2.1 原理2.2 基本…

采用高通Qualcomm处理器的手机进EDL 9008模式的办法

由于我们有很多基于 Qualcomm 的设备&#xff0c;其中一些设备可能会古怪地猜测如何进入 EDL 模式&#xff0c;或者如何正确进入。 例如&#xff0c;对于 Alcatel&#xff0c;您必须先按住两个音量键&#xff0c;然后再按住其中一个&#xff0c;对于 CAT B35&#xff0c;您必须…

Python基础(二十六):模块和包简单介绍

文章目录 模块和包简单介绍 一、模块 1、导入模块 2、制作模块

基于Servlet+jsp+mysql开发javaWeb校园图书管理系统

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;或者没有积分想获取项目&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录一、开发背景二、 需求分析三、开发环境四、运行效果五、开发流程工程目…

【Android安全】Google Hardware-backed Keystore | SafetyNet | 远程证明Remote Attestation

Google Hardware-backed KeyStore Attestation 原理及流程 SafetyNet Hardware-backed Attestation SafetyNet Hardware-backed Attestation&#xff1a;使用了Hardware-backed Keystore SafetyNet 支持Software Attestation 和 Hardware-backed Attestation&#xff0c;根据…

五、Web应用开发模式

web应用开发模式 web应用的开发主要有两种模式&#xff1a; 前后端不分离前后端分离 前后端不分离 在互联网早期&#xff0c;web应用开发采用前后端不分离的方式。 它是以后端直接渲染模板完成响应的一种开发模式。 以前后端不分离的方式开发的web应用的架构图如下&#x…

每天15分钟JMeter进阶篇(1):JAVA 取样器的基本使用

每天15分钟JMeter进阶篇&#xff08;1&#xff09;&#xff1a;JAVA 取样器的基本使用前言准备工作创建开发工程POM文件创建根工程创建module开发JAVA取样器构建、部署运行构建JAR包部署和运行写在最后前言 JMETER官方提供了丰富的取样器&#xff0c;可以支持80%的常见测试场景…

传输层协议:UDP协议

简介 用户数据报协议&#xff08;英语&#xff1a;User Datagram Protocol&#xff0c;缩写&#xff1a;UDP&#xff1b;又称用户数据包协议&#xff09;是一个简单的面向数据包的通信协议&#xff0c;位于OSI模型的传输层。该协议由David P. Reed在1980年设计且在RFC 768中被…

CrimeFragment的UI fragment进行管理

用户界面将由一个名为CrimeFragment的UI fragment进行管理。CrimeFragment的 实例将通过一个名为CrimeActivity的activity来托管。CrimeActivity视图由FrameLayout组件组成&#xff0c;FrameLayout组件为CrimeFragment要显示 的视图安排了存放位置。 CrimeFragment 的视图由一个…

Thinkphp QVD-2022-46174 多语言rce

文章目录漏洞介绍vulhub漏洞搭建漏洞利用利用一&#xff1a;写入文件利用二&#xff1a;文件包含漏洞分析参考文章漏洞介绍 Thinkphp&#xff0c;v6.0.1~v6.0.13&#xff0c;v5.0.x&#xff0c;v5.1.x 如果 Thinkphp 程序开启了多语言功能&#xff0c;那就可以通过 get、head…

[从零开始]用python制作识图翻译器·三

AlsoEasy-RecognitionTranslator具体实现开发环境准备和验证下载conda创建开发环境文字识别模块在线模块离线模块机器翻译模块在线模块离线模块GUIGUI-定位模块GUI-截图模块具体实现 开发环境准备和验证 前期测试项目文件已上传到我的仓库。 下载conda conda是python的版本管…

Day863.协程 -Java 并发编程实战

协程 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于协程的内容。 Java 语言里解决并发问题靠的是多线程&#xff0c;但线程是个重量级的对象&#xff0c;不能频繁创建、销毁&#xff0c;而且线程切换的成本也很高&#xff0c;为了解决这些问题&#xff0c;Java SD…

C++设计模式(4)——策略模式

策略模式 亦称&#xff1a; Strategy 意图 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 问题 一天&#xff0c; 你打算为游客们创建一款导游程序。 该程序的核心…

什么是CNCF云原生

一、CNCF简介 CNCF&#xff1a;全称Cloud Native Computing Foundation&#xff08;云原生计算基金会&#xff09;&#xff0c;成立于2015年12月11日&#xff0c;是一个开源软件基金会&#xff0c;它致力于云原生&#xff08;Cloud Native&#xff09;技术的普及和可持续发展。…

golang 错误处理channel+error真的香

官方推荐golang中错误处理当做值处理&#xff0c; 既然是值那就可以在channel中传输&#xff0c;本文带你看看golang中channelerror来做异步错误处理有多香&#xff0c;看完本文还会觉得golang的错误处理相比java try catch一点优势都没有吗&#xff1f; 场景 如下&#xff0…

LeetCode刷题笔记 - JavaScript(二)

文章目录1.剑指 Offer 60. n个骰子的点数2.面试题67. 把字符串转换成整数3.面试题59 - II. 队列的最大值剑指 Offer 60. n个骰子的点数 面试题67. 把字符串转换成整数 面试题59 - II. 队列的最大值 1.剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上&#xff0c;所有骰子朝上一…

Java运行机制

java的运行机制 Java程序的运行机制分为编写、编译和运行三个步骤。 1.编写 编写是指在Java开发环境中进行程序代码的编辑&#xff0c;最终生成后缀名为“.java”的Java源文件。 2.编译 编译是指使用Java编译器对源文件进行错误排查的过程&#xff0c;编译后将生成后缀名为…