Go——运算符,变量和常量,基本类型

一.运算符

Go语言内置的运算符有:

算术运算符

关系运算符

逻辑运算符

位运算符

赋值运算符

        1.1 算术运算符

        注意:++(自增)和--(自减)在go语言中是单独的语句,并不是运算符。

        1.2 关系运算符

        1.3 逻辑运算符

         1.4 位运算符

        位运算符对整数在内存中的二进制位进行操作。

         1.5 赋值运算符

二.变量和常量

        1.1 变量

        1.1.1 变量声明

        Go语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。并且Go语言的变量声明后必须使用。

  • 标准声明

        Go语言的变量声明格式为:

var 变量名 变量类型

        变量声明以关键字var开头,变量类型放在变量的后面,行尾无需分号。

var name string
var age int
var isOk bool
  • 批量声明 

        每声明一个变量就需要写var关键字会比较繁琐,go语言还支持批量声明变量:

var (
    a string
    b int
    c bool
    d float32
)

        1.1.2 变量初始化

        Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每一个变量都会被初始化成其类型的默认值,例如:整型和浮点型变量的默认值为0,字符串变量的默认值为空字符串,布尔型变量默认值为false,切片,函数,指针变量的默认值为nil。

        当然我们也可以在声明变量的时候为其指定初始值。格式为:

var 变量名 类型 = 表达式

        举个例子:

var name string = "zhangsan"
var sex int = 1

        或者一次初始化多个变量:

var name, sex = "zhangsan", 1
  • 类型推导

        有时候我们会将变量的类型忽略,这个时候编译器会根据等号右边的值来推导变量类型完成初始化。

var name = "zhangsan"
var sex = 1
  • 短变量声明 

         在函数内部,可以使用更加简略的 ' := ' 方式声明并初始化变量。

package main

import (
    "fmt"
)

//全局变量
var m = 10

func main() {
    n := 10
    m := 200 //此处声明局部变量m
    fmt.Println(m, n)
}
  • 匿名变量

        在使用多重赋值时,如果想要忽略某个值,可以使用匿名变量。匿名变量用一个下划线_表示:

package main

fmt (
    "fmt"
)

func foo() (int, string) {
    return 10, "zhangsan"
}

func main() {
    x, _ := foo()
    _, y := foo()
    fmt.Println("x=", x)
    fmt.Println("y=", y)
}

        匿名变量不占用命令空间,不会分配内存,所以匿名变量之间不存在重复声明。(在Lua等编程语言中,匿名变量也被叫做哑元变量)。

注意事项:

  • 函数外的每一个语句都必须以关键字开始(var const func等)。
  • :=不能使用在函数外
  • _多用于占位,表示忽略值

        1.2 常量

        1.2.1 简介

        相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的值。常量的声明和变量声明非常相似,只是把var换成const,常量在定义的时候必须赋值。

const pi = 3.1415
const e = 2.7182

         声明了pi和e这两个变量之后,在整个程序运行期间它们的值都不能再发生变化了。

        多个常量也可以一起声明:

const (
    pi = 3.1415
    e = 2.7182
)

        const同时声明多个常量时,如果省略了值则表示和上一行的值相同。

//n1,n2,n3的值都是100
const (
    n1 = 100
    n2
    n3
)

        1.2.2 iota

        iota是go语言的常量计数器,只能在常量的表达式中使用,iota在const关键字出现是将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。使用iota能简化定义,在定义枚举时很有用。

const (
    n1 = iota //0
    n2        //1
    n3        //2
    n4        //3
)

        1.2.3 iota常见用法

  • 使用下划线_跳过某些值
const (
    n1 = iota //0
    n2        //1
    _        
    n3        //3
    
)
  • iota声明在中间插队
const (
    n1 = iota //0
    n2 = 100 
    n3 = iota //2
    n4        //3
)

const n5 = iota // 0
  • 定义数量级
	const (
		_  = iota
		KB = 1 << (10 * iota) // 1 << (10 * 1)
		MB = 1 << (10 * iota) // 1 << (10 * 2)
		GB = 1 << (10 * iota) // 1 << (10 * 3)
		TB = 1 << (10 * iota) // 1 << (10 * 4)
		PB = 1 << (10 * iota) // 1 << (10 * 5)
	)
  • 多个iota定义在一行
	const (
		a, b = 1 + iota, 2 + iota // 1 + 0,2 + 0
		c, d                      // 1 + 1, 2 + 1
		e, f                      // 1 + 2, 2 + 3
	)

        总结:同一行的iota值相同,经过一行,iota值加1,不管有没有用到iota。

三. 基本类型

         3.1 基本类型的介绍

        Golang更明确的数字类型命名,支持Unicode,支持常用数据结构。

        支持八进制,六进制,以及科学记数法。标准库math定义了各数字类型取值范围。

a, b, c, d := 071, 0x1F, 1e9, math.MinInt16

        空指针在go语言中是nil,而非C/C++的NULL。

        3.1.1 整型

        整型分为以下两大类:

  • 有符号整型:int8,int16,int32,int64
  • 无符号整型:uint8,uint16,uint32,uint64

        其中uint8就是我们熟知的byte类型,int16对应C语言的short类型,int64对应C语言中的long类型。

        3.1.2 浮点型

        Go语言支持两种浮点类型:float32和float64。

        这两种浮点型数据格式遵循IEEE 74标准:float32的浮点数最大范围约为3.4e38,可以使用常量定义math.MaxFloat32。float64的浮点数最大范围约为1.8e308,可以使用常量定义math.MaxFloat64。

        3.1.3 复数

        complex64和complex128

        复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。

        3.1.4 布尔值

        Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。

注意:

  • 布尔类型变量默认值为false。
  • Go语言中不允许将整型强制转换为布尔型。
  • 布尔型无法参与数值运算,也无法与其他类型进行转换。

        3.1.5 字符串

        Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型一样。Go语言里的字符串的内部实现使用UTF-8编码。字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ASCII码字符。

s1 := "hello"
s2 := "你好"
  • 字符串转义字符

        Go语言的字符串常见转义符包含回车,换行,单双引号,制表符等:

  •  多行字符串

        Go语言中需要定义一个多行字符串时,就必须使用反引号字符:

        反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

  • 字符串的常用操作 

         3.1.6 byte和rune类型

        组成每一个字符串的元素叫做字符,可以通过遍历或者单个获取字符串元素获取字符。字符用单引号包裹。

var a = '中'
var b = 'x'

        Go语言的字符有以下两种:

uint8类型,或者叫byte类型,代表ASCII码的一个字符。

int32类型,或者叫rune类型,代表一个UTF-8字符。 

        当需要处理中文,日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32。Go使用特殊的rune类型来处理Unicode,让基于Unicode的文本处理更加方便,也可以使用byte类型进行默认字符串处理,性能和扩展性都有照顾。

        因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则会出现上面第一行的结果。

        字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的,字符串是由byte字节组成,所以字符串的长度是byte字节长度。rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

        一个字符可能由多个byte组成,所以len()字符串变量得到的长度可能大于字符串变量长度,想要得到实际字符串长度,可能先转为[]rune数组,求[]rune数组长度。

package main

import "fmt"

func traversalString(s string) {
	fmt.Printf("strlen:%d", len(s))
	fmt.Println()
	//byte
	bt := []byte(s)
	for i := 0; i < len(bt); i++ {
		fmt.Printf("%v(%c)", bt[i], bt[i])
	}
	fmt.Println()
	//rune
	rn := []rune(s)
	for i := 0; i < len(rn); i++ {
		fmt.Printf("%v(%c)", rn[i], rn[i])
	}
	fmt.Println()
	fmt.Printf("[]rune:%d", len(rn))
}

func main() {
	traversalString("pprof.cn博客")
}

  •  修改字符串

        要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换成string。无论哪种转换都会重新分配内存,并复制字节数组。

        3.1.7 类型转换

        Go语言中只有强制类型转换,没有隐式类型转换。并且该语法只能在两个类型之间支持相互转换的时候使用。

强制类型转换的基本语法:

T(表达式)

其中,T表示要转换的类型。表达式包括变量,复杂算子和函数返回值等。

package main

import (
	"fmt"
	"math"
)

func sqrtDemo() {
	var a, b = 3, 4
	var c int

	//math.Sqrt参数类型是float64类型,需要强制类型转换
	//返回值是float64,而c是int类型,需要强制类型转换
	c = int(math.Sqrt(float64(a*a + b*b)))
	fmt.Println(c)
}

func main() {
	sqrtDemo()
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UnityShader:IBL

效果&#xff1a; 实现&#xff1a; Shader "MyShader/IBL" {Properties{_CubeMap ("环境贴图", Cube) "white" {}_Exposure("曝光",float)1.0_Color("颜色",color)(1,1,1,1)_NormalMap("法线贴图",2d)"bu…

鸿蒙开发(五)-应用签名相关

鸿蒙开发(五)-应用签名相关 本篇文章主要介绍下鸿蒙应用下的应用签名的创建与配置。 根据之前的介绍&#xff0c;我们知道&#xff0c;在DevEco Studio默认创建的应用程序&#xff0c;是没有sign配置的。 默认输出的应用文件如下&#xff1a; build->default->output…

【小沐学AI】数据分析的Python库:Pandas AI

文章目录 1、简介2、安装2.1 Python2.2 PandasAI 3、部署4、功能4.1 大型语言模型 &#xff08;LLM&#xff09;4.1.1 BambooLLM4.1.2 OpenAI 模型4.1.3 谷歌 PaLM4.1.4 谷歌 Vertexai4.1.5 Azure OpenAI4.1.6 HuggingFace 模型4.1.7 LangChain 模型4.1.8 Amazon Bedrock 模型4…

手机翻页效果的电子画册如何实现?

​在信息 爆炸的时代&#xff0c;纸质画册已经难以满足人们快速获取和分享信息的需求。而电子画册&#xff0c;以其独特的翻页效果和便捷的传播方式&#xff0c;正逐渐受到大众的青睐。那么&#xff0c;这种让人眼前一亮的手机翻页电子画册是如何制作的呢&#xff1f; 接下来&a…

一体成型PFA尖头镊子高纯特氟龙材质镊子适用半导体新材料

PFA镊子用于夹取小型片状、薄状、块状样品&#xff0c;广泛应用在半导体、新材料、新能源、原子能、石油化工、无线电、电力机械等行业。 具有耐高低温性&#xff08;可使用温度-200℃&#xff5e;&#xff0b;260℃&#xff09;、耐腐蚀、表面不粘性等特点&#xff0c;用于苛…

C#调用Halcon出现尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException

一、现象 在C#中调用Halcon&#xff0c;出现异常提示&#xff1a;尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException 二、原因 多个线程同时访问Halcon中的某个公共变量&#xff0c;导致程序报错 三、测试 3.1 Halcon代码 其中tsp_width…

【Linux】进程间通信2(共享内存||消息队列)

共享内存 介绍 1.共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 2.当共享内存创建出来后&#xff0c;通过系统调用挂接到…

StarRocks实战——云览科技存算分离实践

目录 背景 一、平台现状&痛点 1.1 使用组件多&#xff0c;维护成本高 1.2 链路冗长&#xff0c;数据时效性难以保证 1.3 服务稳定性不足 二、StarRocks 存算分离调研 2.1 性能对比 2.2 易用性 2.3 存储成本 三、StarRocks 存算分离实践 3.1 查询优化 3.1.1 物化…

人工智能轨道交通行业周刊-第75期(2024.3.4-3.17)

本期关键词&#xff1a;大安防平台、调度集中系统、道岔爬行、詹式车钩、星火大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路…

子组件自定义事件$emit实现新页面弹窗关闭之后父界面刷新

文章目录 需求弹窗关闭之后父界面刷新展示最新数据 实现方案AVUE 大文本默认展开slotVUE 自定义事件实现 父界面刷新那么如何用呢? 思路核心代码1. 事件定义2. 帕斯卡命名组件且在父组件中引入以及注册3. 子组件被引用与父事件监听4.父组件回调函数 5.按钮弹窗事件 需求 弹窗…

面向对象编程第一式:封装 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

简单!实用!易懂!:Java如何批量导出微信收藏夹链接-->转换成Markdown

文章目录 前言参考方案方案1&#xff1a;Python方案2&#xff1a;Python 我的方案手动前置操作代码处理 前言 不知道是否有很多小伙伴跟我一样&#xff0c;有个问题非常愁&#xff0c;对于收藏党来说&#xff0c;收藏了学会了&#xff01;然后导致微信收藏夹的东西越来越多了&…

【LLM加速】注意力优化(基于位置/内容的稀疏注意力 | flashattention)

note &#xff08;1&#xff09;近似注意力&#xff1a; Routing Transformer采用K-means 聚类方法&#xff0c;针对Query和Key进行聚类&#xff0c;类中心向量集合为 { μ i } i 1 k \left\{\boldsymbol{\mu}_i\right\}_{i1}^k {μi​}i1k​ &#xff0c;其中k 是类中心的…

@RequestParam、@PathVariable、@RequestBody

1、中文翻译 RequestParam-请求参数、PathVariable-路径变量、RequestBody请求体 2、作用&#xff1a; Controller中获取前端传递的参数 3、从注解本身角度分析 3.1、PathVariable&#xff1a;路径变量 通过 PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形…

【组合回溯】Leetcode 131. 分割回文串

【组合回溯】Leetcode 131. 分割回文串 解法 切割组合回溯 ---------------&#x1f388;&#x1f388;131. 分割回文串 题目链接&#x1f388;&#x1f388;------------------- 解法 切割组合回溯 全局变量&#xff1a;result存储所有path的集合&#xff0c;path用来记录切…

文件系统 与 软硬链接

目录 一、文件系统 认识磁盘 磁盘存储的逻辑抽象结构 块组的内容 inode Table Data blocks inode Bitmap Block Bitmap Group Descriptor Table Super Block 理解目录 二、软硬链接 软链接​ 硬链接 硬链接数 一、文件系统 之前的博客主题叫做"进程打开文…

Redisinsight默认端口改成5540了!网上的8001都是错误的

Redisinsight 打开白屏解决方法 最近发现一个很讨厌的bug&#xff0c;就是redisinsight运行之后&#xff0c;不行了&#xff0c;在网上找到的所有资料里面&#xff0c;redis insight都是运行在8001端口&#xff0c;但是我现在发现&#xff0c;变成了5540 所以对应的docker-com…

Node.js与webpack(三)

上一节&#xff1a;Node.js与Webpack笔记&#xff08;二&#xff09;-CSDN博客 从0来一遍&#xff08;webpack项目&#xff09; 将之前的webpack 的纯开发配置&#xff0c;重新创建空白项目&#xff0c;重新做一遍&#xff0c;捋一遍思路防止加入生产模式时候弄混 1.创建文件夹…

SVM-支持向量机实验分析(软硬间隔,线性核,高斯核)

目录 一、前言 二、实验 0. 导入包 1. 支持向量机带来的效果 2. 软硬间隔 3. 非线性支持向量机 4. 核函数变换 线性核 高斯核 对比不同的gamma值对结果的影响 一、前言 学习本文之前要具有SVM支持向量机的理论知识&#xff0c;可以参考支持向量机&#xff08;Support Vector …

epoll怎么就高效了?

目录 摘要 1 举个栗子 2 从 epoll_create 开始 3 epoll_ctl&#xff0c;插入待监听的描述符 3.1 故事围绕 ep_item 展开 3.2 在 socket 等待队列上设置 epoll 回调 3.3 关系变得复杂 4 epoll_wait 等你 4.1 等待就绪事件 4.2 共享内存&#xff1f; 5 来了来了&#xf…
最新文章