Yaklang 中的类型和变量

news2024/11/13 14:55:30

Yaklang 的类型其实非常简单,我们仅需要记住如下类型即可

  1. string 字符串类型,用以快速构建一个字符串
  2. int 整数类型:在 64 位机中,int 和 int64 是一样的
  3. float 浮点类型,用来定义和表示浮点数
  4. byte 本质上等同于 uint8
  5. undefined / nil 为定义的值,我们可以理解为空值
  6. bool 只有 true 或 false
  7. map,基本等同于 Python 中的 Dict
  8. slice,基本等同于 Python 中的 List
  9. channel,基本等同于 Golang 中的 Channel
  10. var,任意类型,等同于 Golang 中的 interface{}

我们以一个表格快速来对比大家熟悉的语言的类型,以方便大家快速理解

对比类型YaklangPythonGolang
字符串stringstringstring
二进制字符串[]byteb-string[]byte
整数intintint8, int16, int32, int64
uint8, uint16, uint32, uint64
int
浮点floatfloatfloat32, float64(double)
空值undefined / nil不支持nil
布尔值boolboolbool
键值组(map / dict)mapdictmap
数组 / 切片 / 列表slicelistslice / array
结构体 / 类 / 接口不支持classstruct / interface 体系
数据通道channel不支持channel
任意类型varobjectinterface{}

变量的声明,定义与使用

在yaklang中定义/声明一个变量十分简单:

var a            // 声明变量a
var b, c         // 声明变量b,c
var d, e = 1, 2  // 声明变量d,e并分别赋值为1,2

同时,我们可以直接对一个变量进行赋值,省略定义/声明的步骤:

a, b = 1, 2 // 此时a=1, b=2

下面是每一种数据类型的示例:

字符串

// 这是yaklang的字符串类型
a:="这是一个字符串";//一个
// 使用dump函数进行输出
dump(a);

image.png

二进制字符串

// 这是yaklang的二进制字符串类型
binaryString := "0b101101";
// 使用dump函数进行输出
dump(binaryString);

image.png

整数

注意yaklang中的整数型和golang是一样的。在Go语言中,int64 是一种数据类型,它是一个64位的有符号整型。这意味着它可以存储的整数值的范围是从 -9223372036854775808 到 9223372036854775807(即从 -2^63 到 2^63 - 1)

// c:=213333333333345465467686908680857435243567821345678345678223456789123456789123456789 超过了最大值范围
/**
在Go语言中,int64 是一种数据类型,它是一个64位的有符号整型。这意味着它可以存储的整数值的范围是从 -9223372036854775808 到 9223372036854775807(即从 -2^63 到 2^63 - 1)
 */
c=9223372036854775805
dump(c);

image.png
如果超出int64的范围则会报错

d=9223372036854775809;
dump(d);

image.png
image.png

浮点

浮点型即为小数型

d=1.23465;
dump(d);

image.png

空值

什么是空值?字面意思就是没有具体的值。在 Go 语言中,nil 是一个预定义的标识符,用于表示指针、通道、函数、接口、映射或切片类型的零值。nil 并不同于其他语言中的 null 或 None,因为它具体只能用于上述几种类型。基本类型(如 int、float、bool 和 string)以及结构体类型都有自己的零值,例如 0、0.0、false 和 “”,但它们的零值不是 nil。但是Yaklang有一点不太一样,yak不存在“零值”,看下面的代码就知道了
这是golang中的基础数据类型的定义

package main

import "reflect"

func main() {
	var a int
	reflect.ValueOf(a)
}

可以运行得到“零值”,但是yak则不能这样定义
image.png
此外在Yaklang中空值有两种:

  • undefined
  • nil

在yaklang中,空值表示为 undefinednil。这两种表示方式都是用来表示一个变量没有被赋值或者一个对象没有某个属性。
首先,我们来看一下undefinednil的区别:

  • undefined:表示变量没有被赋值或者对象没有某个属性,它是一个非法的值,不能用于任何有效的操作。
  • nil:表示变量被赋值为空值,通常用于表示一个对象没有某个属性或者一个数组没有某个元素。
var a;
dump(a)

image.png

布尔值

a:=true;
dump(a)

image.png

键值组(map / dict)

这个数据类型是常见的一种类型,形式为键名:键名对应的值。
在 Yaklang 中,可以使用 map 关键字来定义一个 Map 类型的变量。Map 是一种键值对的数据结构,其中每个键都映射到一个值。yaklang同样有两种map的定义方式:

使用make函数定义:
# 定义一个 Map 类型的变量
m := make(map[string]int);
dump(m);

image.png

使用字面量定义:
# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7};
dump(m);

image.png

访问和赋值

要向map中添加新的键值对,可以使用以下语法:

m["key"] = value

例子如下:

# 定义一个 Map 类型的变量
m := make(map[string]int);
dump(m);
m["test"]=123;
dump(m);

image.png
要从map中读取值:

value := m["key"]

例子如下:

# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
dump(m["apple"])		//quchu apple的值

image.png
如果请求的键不存在于map中,Go会返回值类型的零值,而Yaklang则会返回空值

# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
dump(m["admin"])		//取出不存在的admin的值

image.png

删除map里的某一项

要从map中删除键值对,使用delete内置函数:

delete(m, "key(键名)")

例子如下:

# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
delete(m, "apple")
dump(m)

image.png

遍历map

可以使用for循环和range关键字遍历map中的所有键值对:

# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
for key,value := range m {
    println("键名:",key,"键值:",value);
}

image.png

数组 / 切片 / 列表

在Go语言中,数组和切片是基础且不同的类型,它们都用于存储元素的序列。Go语言没有内置的列表数据类型,但切片提供类似于动态数组的功能。

切片中的length是该切片中当前已存储的元素个数,切片的容量是该切片指向的数组的元素个数。往一个满了的切片(切片长度=切片容量)中添加新元素会触发创建一个新的数组,并且新数组的容量是原来的2倍,该新数组会将原数组中的元素都拷贝过来,同时将slice中的指针更新到指向新数组

切片(Slice)是对数组一个连续片段的引用,因此它是可变长度的。

使用make创建新切片

使用make创建切片,并指定长度和可选的容量:

s := make([]int, 5)    // 长度为5,容量也为5
s := make([]int, 5, 10) // 长度为5,容量为10

image.png
image.png

PS:容量决定切片上限,长度则是实际上的元素个数。即容量必须大于或等于长度

# 定义一个切片
s := make([]int, 5, 3)
dump(s)

上面这种就是错误的
image.png

从数组或切片创建新切片
# 定义一个切片
// s := make([]int, 5, 10)
s := [1,2,3,5,654,67,76,7,68,4]
a := s[1:5]
dump(a)		 // 创建一个新切片,包含从索引1到索引5的元素,长度是4,容量是10

image.png

访问切片元素

和数组一样,可以通过索引访问切片的元素:

# 定义一个切片
s := make([]int, 5, 10)
dump(s[0])		// 获取第一个元素的值

image.png

修改切片元素
s[0] = 100 // 设置第一个元素的值为100

例子:

golang与Yaklang之间切片区别

在golang中由于切片是引用类型,修改其元素会影响底层数组和其他引用同一数组的切片,但是在Yaklang中修改切片原数组不受影响

golang中切片的修改
package main

import (
	"fmt"
)

func main() {
	arr := [5]int{1, 2, 3, 4, 5} //原始数组
	s := arr[1:4]                //数组产生的切片
	b := arr[1:4]                //引用同一数组的切片
	//fmt.Println(s)
	//fmt.Println(b)
	//fmt.Println(arr)

	s[0] = 10000
	s[1] = 10000
	fmt.Println("改后", s)
	fmt.Println("改后", b)
	fmt.Println("改后", arr)
}

image.png

Yaklang的切片修改
# 定义一个切片
// s := make([]int, 5, 10)
s := [1,2,3,5,654,67,76,7,68,4]
a := s[0:5]
b := s[0:5] 
println("原始切片:",a)
println("原始切片:",b)
println("原始数组:",s)
a[0]=10000
a[1]=10000
println("修改后的切片:",a)
println("修改后的切片:",b)
println("修改切片后的数组:",s)

image.png

添加元素

可以使用append函数向切片添加元素。如果添加的元素超出切片容量,Go会自动创建一个新的底层数组,并将元素复制过去:

s = append(s, 6)

例子:

# 定义一个切片
// s := make([]int, 5, 10)
s := [1,2,3,5,654,67,76,7,68,4]
a := s[0:5]
b := s[0:5] 
println("原始切片:",a)
println("原始切片:",b)
println("原始数组:",s)
a=append(a,"添加的元素")
println("修改后的切片:",a)
println("修改后的切片:",b)
println("修改切片后的数组:",s)

image.png

遍历切片

可以使用for循环或者for配合range关键词来遍历切片:

// 使用for循环
for i := 0; i < len(s); i++ {
    fmt.Println(s[i])
}

// 使用for和range
for index, value := range s {
    fmt.Println(index, value)
}

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

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

相关文章

docker安装marcocesarato/php-conventional-changelog报错

composer require --dev marcocesarato/php-conventional-changelog --no-update “marcocesarato/php-conventional-changelog”: “^1.17” 在小皮环境没问题&#xff0c;在dockerswoole环境下报错 "scripts": {"changelog": "conventional-chang…

采用云端SaaS服务的云HIS基层医院信息管理系统源码

目录 一、日常运维工作内容 二、科室巡查工作 三、网络安全管理工作内容 四、业务能力提升学习 云HIS系统业务 一、日常运维工作内容 1. 系统监控&#xff1a;每天早晨第一件事就是打开电脑&#xff0c;查看各个系统的运行状况。通过监控系统&#xff0c;可以实时了解到服…

大数据质量管制规范示例

大数据质量管制规范示例 一、前提概要二、相关概念三、管理原则四、治理委员五、应用管理六、查验方式七、考核比率八、扣分标准九、责任划分十、追责范围十一、其它条例十二、总结 一、前提概要 在当今大数据信息时代&#xff0c;大数据平台&#xff08;大数据平台开发规范示…

【ChatGPT】利用ChatGPT将图片转换成JSON文件

前言 我在创建自己的GPT时,通常会上传一些JSON文件作为知识库,我还制作了一些脚本工具,将PDF文件转换成JSON文件。但是在这个过程中产生一个问题,PDF文件中会有一些图表,JSON文件就不能存储和表达这些图表的内容了。那该怎么办呢?这里跟大家介绍一个方法,可以有效地将图…

【论文笔记】Fully Sparse 3D Panoptic Occupancy Prediction

原文链接&#xff1a;https://arxiv.org/abs/2312.17118 1. 引言 现有的3D占用预测方法建立密集的3D特征&#xff0c;没有考虑场景的稀疏性&#xff0c;因此难以满足实时要求。此外&#xff0c;这些方法仅关注语义占用&#xff0c;无法区分实例。 本文认为场景的稀疏性包含两…

查询指定日期是否为法定工作日的服务接口

在现代社会中&#xff0c;人们的工作与生活节奏日益加快&#xff0c;为了更好地规划工作与休息时间&#xff0c;在开发应用软件时&#xff0c;通过查询指定日期是否为法定工作日的服务接口是一个非常有用的功能。本文将介绍一个API接口&#xff0c;可以根据国家的放假安排来判断…

Schema Builder - Salesforce的图形化工具

Schema Builder这个工具最近几年接触Salesforce的宝们用到的很少&#xff0c;这里给大家简单介绍下&#xff1a; 1. Schema Builder是一个动态的环境&#xff0c;在这个环境里管理员能查看或更改组织内对象及对象之间的关联关系&#xff1b;如果一开始接触CRM可以通过这个图形…

JVM:垃圾收集器(7种)

垃圾收集器关系图&#xff1a; 如果两个收集器之间存在连线&#xff0c;就说明它们可以搭配使用。它们说在的区域则表示这个收集器属于新生代收集器还是老年代收集器。其中Serial&#xff08;串行&#xff09;、Parallel&#xff08;并行&#xff09; 1、Serial收集器 Serial收…

F - Digital Roots HUOJ

题目 The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the pro…

Spring Boot 学习之——@SpringBootApplication注解(自动注解原理)

SpringBootApplication注解 springboot是基于spring的新型的轻量级框架&#xff0c;最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看&#xff0c;如何实现传奇的自动配置 SpringBootApplication//标注在某个类上&#xff0c;表示这个类是SpringBoot…

大数据开发之Kafka(broker、消费者、eagle监控、kraft模式)

第 4 章&#xff1a;Kafka Broker 4.1 Kafka Broker工作流程 4.1.1 Zookeeper存储的Kafka的信息 1、查看zookeeper中的kafka节点所存储的信息 启动Zookeeper客户端 [atguiguhadoop104 zookeeper-3.5.7]$ bin/zkCli.sh 通过ls命令列出kafka节点内容 [zk: localhost:2181(CO…

Docker(六)数据管理

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Docker 数据管理 这一章介绍如何在 Docker 内部以及容器之间管理数据&#xff0c;在容器中管理数据主要有两种方式&#xff1a; 数据卷&…

【Java】JDBC练习

JDBC练习 环境准备 -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered …

Flink处理函数(3)—— 窗口处理函数

窗口处理函数包括&#xff1a;ProcessWindowFunction 和 ProcessAllWindowFunction 基础用法 stream.keyBy( t -> t.f0 ).window( TumblingEventTimeWindows.of(Time.seconds(10)) ).process(new MyProcessWindowFunction()) 这里的MyProcessWindowFunction就是ProcessWi…

STM32 GD32 瑞萨 psoc 等单片机 无线wifi蓝牙最佳解决方案

新联鑫威一系列低功耗高性价比sdio wifi/蓝牙combo的模块CYWL6208 , CYWL6312, CYW6209等可以搭配stm32 各种型号例如以下,支持sta/ap/apsta&#xff0c;双模蓝牙的应用&#xff0c;支持rt-thread, freertos, Azure RTOS, Linux, Android系统. 稳定强&#xff0c;功耗低&#x…

从规则到神经网络:机器翻译技术的演化之路

文章目录 从规则到神经网络&#xff1a;机器翻译技术的演化之路一、概述1. 机器翻译的历史与发展2. 神经机器翻译的兴起3. 技术对现代社会的影响 二、机器翻译的核心技术1. 规则基础的机器翻译&#xff08;Rule-Based Machine Translation, RBMT&#xff09;2. 统计机器翻译&am…

[ELK] ELK企业级日志分析系统

一、ELK 概述 1.1 ELK 简介与组件 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ●ElasticSearch&#xff1a;是基于Lucene&#xff08;一个…

文献分享四:(基础)Pyroelectric drift of integrated-optical LiNbO3 modulators

文献来源——S. M. Kostritskii, Yu. N. Korkishko, V. A. Fedorov & A. V. Yatsenko (2021) Pyroelectric drift of integrated-optical LiNbO3 modulators, Ferroelectrics, 574:1, 170-178, DOI: 10.1080/00150193.2021.1888062 本文分析了我们之所以需要偏置电路的原因…

Lua 快速入门 · 教程笔记

Lua语言快速入门 教程笔记 前言1. Lua 语言介绍2. Lua 语言基础之基本语法声明变量声明方法使用 if - else使用 for使用 while 3. Lua 语言基础之表4. Lua 语言基础之数组插入元素移除元素获取表的长度全局表 5. Lua 语言面向对象之复制表的方式面向对象实现继承和重写父类方法…

鸿蒙开发-UI-布局-线性布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 鸿蒙开发-UI-布局 文章目录 前言 一、基本概念 二、布局子元素 1.子元…