Yaklang 中的类型和变量
Yaklang 的类型其实非常简单,我们仅需要记住如下类型即可
- string 字符串类型,用以快速构建一个字符串
- int 整数类型:在 64 位机中,int 和 int64 是一样的
- float 浮点类型,用来定义和表示浮点数
- byte 本质上等同于 uint8
- undefined / nil 为定义的值,我们可以理解为空值
- bool 只有 true 或 false
- map,基本等同于 Python 中的 Dict
- slice,基本等同于 Python 中的 List
- channel,基本等同于 Golang 中的 Channel
- var,任意类型,等同于 Golang 中的 interface{}
我们以一个表格快速来对比大家熟悉的语言的类型,以方便大家快速理解
| 对比类型 | Yaklang | Python | Golang |
|---|---|---|---|
| 字符串 | string | string | string |
| 二进制字符串 | []byte | b-string | []byte |
| 整数 | int | int | int8, int16, int32, int64 |
| uint8, uint16, uint32, uint64 | |||
| int | |||
| 浮点 | float | float | float32, float64(double) |
| 空值 | undefined / nil | 不支持 | nil |
| 布尔值 | bool | bool | bool |
| 键值组(map / dict) | map | dict | map |
| 数组 / 切片 / 列表 | slice | list | slice / array |
| 结构体 / 类 / 接口 | 不支持 | class | struct / interface 体系 |
| 数据通道 | channel | 不支持 | channel |
| 任意类型 | var | object | interface{} |
变量的声明,定义与使用
在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);

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

整数
注意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);

如果超出int64的范围则会报错
d=9223372036854775809;
dump(d);


浮点
浮点型即为小数型
d=1.23465;
dump(d);

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

此外在Yaklang中空值有两种:
- undefined
- nil
在yaklang中,空值表示为 undefined或 nil。这两种表示方式都是用来表示一个变量没有被赋值或者一个对象没有某个属性。
首先,我们来看一下undefined和nil的区别:
undefined:表示变量没有被赋值或者对象没有某个属性,它是一个非法的值,不能用于任何有效的操作。nil:表示变量被赋值为空值,通常用于表示一个对象没有某个属性或者一个数组没有某个元素。
var a;
dump(a)

布尔值
a:=true;
dump(a)

键值组(map / dict)
这个数据类型是常见的一种类型,形式为键名:键名对应的值。
在 Yaklang 中,可以使用 map 关键字来定义一个 Map 类型的变量。Map 是一种键值对的数据结构,其中每个键都映射到一个值。yaklang同样有两种map的定义方式:
使用make函数定义:
# 定义一个 Map 类型的变量
m := make(map[string]int);
dump(m);

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

访问和赋值
要向map中添加新的键值对,可以使用以下语法:
m["key"] = value
例子如下:
# 定义一个 Map 类型的变量
m := make(map[string]int);
dump(m);
m["test"]=123;
dump(m);

要从map中读取值:
value := m["key"]
例子如下:
# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
dump(m["apple"]) //quchu apple的值

如果请求的键不存在于map中,Go会返回值类型的零值,而Yaklang则会返回空值
# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
dump(m["admin"]) //取出不存在的admin的值

删除map里的某一项
要从map中删除键值对,使用delete内置函数:
delete(m, "key(键名)")
例子如下:
# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
delete(m, "apple")
dump(m)

遍历map
可以使用for循环和range关键字遍历map中的所有键值对:
# 定义一个 Map 类型的变量
m := map[string]int{"apple": 5, "lettuce": 7}
for key,value := range m {println("键名:",key,"键值:",value);
}

数组 / 切片 / 列表
在Go语言中,数组和切片是基础且不同的类型,它们都用于存储元素的序列。Go语言没有内置的列表数据类型,但切片提供类似于动态数组的功能。
切片中的length是该切片中当前已存储的元素个数,切片的容量是该切片指向的数组的元素个数。往一个满了的切片(切片长度=切片容量)中添加新元素会触发创建一个新的数组,并且新数组的容量是原来的2倍,该新数组会将原数组中的元素都拷贝过来,同时将slice中的指针更新到指向新数组
切片(Slice)是对数组一个连续片段的引用,因此它是可变长度的。
使用make创建新切片
使用make创建切片,并指定长度和可选的容量:
s := make([]int, 5) // 长度为5,容量也为5
s := make([]int, 5, 10) // 长度为5,容量为10


PS:容量决定切片上限,长度则是实际上的元素个数。即容量必须大于或等于长度
# 定义一个切片
s := make([]int, 5, 3)
dump(s)
上面这种就是错误的

从数组或切片创建新切片
# 定义一个切片
// 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

访问切片元素
和数组一样,可以通过索引访问切片的元素:
# 定义一个切片
s := make([]int, 5, 10)
dump(s[0]) // 获取第一个元素的值

修改切片元素
s[0] = 100 // 设置第一个元素的值为100
例子:
golang与Yaklang之间切片区别
在golang中由于切片是引用类型,修改其元素会影响底层数组和其他引用同一数组的切片,但是在Yaklang中修改切片原数组不受影响
golang中切片的修改
package mainimport ("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] = 10000s[1] = 10000fmt.Println("改后", s)fmt.Println("改后", b)fmt.Println("改后", arr)
}

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)

添加元素
可以使用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)

遍历切片
可以使用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)
}
相关文章:
Yaklang 中的类型和变量
Yaklang 的类型其实非常简单,我们仅需要记住如下类型即可 string 字符串类型,用以快速构建一个字符串int 整数类型:在 64 位机中,int 和 int64 是一样的float 浮点类型,用来定义和表示浮点数byte 本质上等同于 uint8u…...
C语言从入门到实战——编译和链接
编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理(预编译)2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中,编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…...
【实战教程】ThinkPHP6分页功能轻松实现,让你的网站更高效!
ThinkPHP是一款非常流行的PHP开发框架,其最新版本ThinkPHP6在性能和易用性方面都得到了很大的改善。分页功能是网页开发中非常常见的功能,而ThinkPHP6也提供了非常方便的分页方法。本文将介绍如何实现ThinkPHP6的分页功能。 一、了解分页功能 在Web应用…...
专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信
今年专业课810信号与系统130,总分380顺利考上哈尔滨工程大学,一年的努力终于换来最后的录取,期中复习有得有失,以下总结一下自己的复习经历,希望对大家有帮助,天道酬勤,加油!专业课&…...
旅游项目day08
1. 旅游日记(游记) 后端:实体类,列表,查看,审核 前端:目的地明细中-游记->带范围条件查询,游记首页,【扩展】游记添加/编辑,【扩展】添加游记时间没登录时…...
蓝桥杯真题(Python)每日练Day2
题目 题目分析 对于本题首先确定其数据结构为优先队列,即邮费最小的衣服优先寄,算法符合贪心算法。可以直接使用queue库的PriorityQueue方法实现优先队列。关于PriorityQueue的使用方法主要有: import queue q queue.Queue()# 队列 pq qu…...
IntelliJ IDEA 拉取gitlab项目
一、准备好Gitlab服务器及项目 http://192.168.31.104/root/com.saas.swaggerdemogit 二、打开 IntelliJ IDEA安装插件 打开GitLab上的项目,输入项目地址 http://192.168.31.104/root/com.saas.swaggerdemogit 弹出输入登录用户名密码,完成。 操作Comm…...
RHCSA上课笔记(前半部分)
第一部分 网络服务 第一章 例行性工作 1.单一执行的例行性工作 单一执行的例行性工作(就像某一个时间点 的闹钟):仅处理执行一次 1.1 at命令:定时任务信息 [rhellocalhost ~]$ rpm -qa |grep -w at at-spi2-core-2.40.3-1.el9.x…...
C++代码入门05 字符串容器
图源:文心一言 上机题目练习整理,本篇作为字符串容器的代码,提供了常规解法及其详细解释,供小伙伴们参考~🥝🥝 第1版:在力扣新手村刷题的记录~🧩🧩 方法:常…...
vue3 项目中 arguments 对象获取失败问题
问题 在 vue3 项目中 获取到的 arguments 对象与传入实参不符,打印出函数中的 arguments 对象显示如下: 原因 作者仔细回看代码才发现,自己一直用的是 vue3 的组合式写法,函数都是箭头函数,而箭头函数不存在 argumen…...
12.线程同步
12.线程同步 1. 为什么需要线程同步2. 互斥锁2.1 互斥锁初始化2.1.1 PTHREAD_MUTEX_INITIALIZER 宏初始化2.1.2 使用函数初始化 2.2 加锁和解锁2.3 pthread_mutex_trylock()2.4 销毁互斥锁2.5 互斥锁死锁2.6 互斥锁的属性 3. 条件变量3.1 条件变量初始化3.2 通知和等待条件变量…...
开发安全之:System Information Leak: External
Overview 在调用 error_reporting() 过程中,程序可能会显示系统数据或调试信息。由 error_reporting() 揭示的信息有助于攻击者制定攻击计划。 Details 当系统数据或调试信息通过套接字或网络连接使程序流向远程机器时,就会发生外部信息泄露。 示例 1…...
burp靶场--文件上传
burp靶场–文件上传 https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload 1.文件上传 1、原理:文件上传漏洞是指Web服务器允许用户将文件上传到其文件系统,而不充分验证文件的名称、类型、…...
mac 中vscode设置root启动
1. 找到你的vscode app,点击鼠标右键------->选项----->在访达中显示 2. 终端中输入以下命令,不要点回车,不要点回车,输入一个空格 sudo chflags uchg 3. 然后将你的程序拖到终端,会自动…...
【MySQL数据库专项 一】一个例子讲清楚数据库三范式
好的,让我们以学校数据库中的一个表为例来说明第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的概念。 什么是数据库三范式 数据库的范式(Normalization)是一组关于数据…...
【笔记】关于期刊
什么是统计源期刊 统计源期刊,全称为“中国科技论文统计源期刊”,也称作中国科技核心期刊,是由中国科技信息研究所(ISTIC)受国家科技部委托,选定的一系列在中国出版的高质量自然科学类学术期刊。这些期刊是…...
SpringMVC-.xml的配置
文章目录 一、对pom.xml的配置二、对web.xml1.第一种方式2. 第二种方式 三、对SpringMVC.xml的配置 一、对pom.xml的配置 <!-- 打包成war包--><packaging>war</packaging> <dependencies><!-- SpringMVC--><dependency><gro…...
Java找二叉树的公共祖先
描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…...
《Linux高性能服务器编程》笔记03
Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第07章 Linux服务器程序规范7.1日志7.2用…...
Java毕业设计-基于ssm的网上求职招聘管理系统-第85期
获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的网上求职招聘管理系统:前端 jsp、jquery,后端 springmvc、spring、mybatis,角色分为管理员、招聘人员、用户;集成…...
Rivets.js实际项目案例:构建电商应用的数据绑定架构
Rivets.js实际项目案例:构建电商应用的数据绑定架构 【免费下载链接】rivets Lightweight and powerful data binding. 项目地址: https://gitcode.com/gh_mirrors/ri/rivets Rivets.js是一个轻量级且功能强大的数据绑定库,它能帮助你快速构建响应…...
COMSOL 钢制支架静态分析:从建模到结果解析
comsol支架-静态分析, COMSOL Multiphysics 和“结构力学模块”中对结构力学问题进行建模的基本原理及操作。 介绍线性静态分析,包括材料属性和边界条件的定义。 在计算出解之后,学习如何分析结果并检查反作用力。 模型是钢制支架。 这种支架…...
DeOldify图像上色服务性能调优:针对STM32嵌入式设备输出的图像优化
DeOldify图像上色服务性能调优:针对STM32嵌入式设备输出的图像优化 你有没有想过,把家里那些泛黄的老照片,用AI技术一键上色后,直接显示在复古的电子相框里?这个想法听起来很酷,但实际操作起来,…...
GLM-4v-9b开源镜像实操手册:transformers/vLLM/llama.cpp三端调用
GLM-4v-9b开源镜像实操手册:transformers/vLLM/llama.cpp三端调用 1. 开篇:认识这个强大的多模态模型 今天给大家介绍一个特别实用的AI模型——GLM-4v-9b,这是一个能同时看懂图片和文字的多模态模型。想象一下,你给它一张图片&a…...
6个维度教你选择Mac Mouse Fix的最佳部署渠道
6个维度教你选择Mac Mouse Fix的最佳部署渠道 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 副标题:开发者、普通用户与企业用户的技术选型指南…...
BetterJoy终极指南:3大难题快速解决Switch控制器PC连接问题
BetterJoy终极指南:3大难题快速解决Switch控制器PC连接问题 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode…...
Open WebUI:企业级自托管AI平台架构深度解析
Open WebUI:企业级自托管AI平台架构深度解析 【免费下载链接】open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI,设计用于完全离线操作,支持各种大型语言模型(LLM)运行器,包括Ollama…...
如何用铜钟音乐打造纯粹听歌体验?5个让你告别广告干扰的核心优势
如何用铜钟音乐打造纯粹听歌体验?5个让你告别广告干扰的核心优势 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特!(密码重置功能已回归) 项目地址: https://gitcode.com/Git…...
3步解决Atlas OS中Xbox登录错误0x89235107的实用方案
3步解决Atlas OS中Xbox登录错误0x89235107的实用方案 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atlas …...
突破性GPU显存释放技术:解决ComfyUI模型占用难题的底层API方案
突破性GPU显存释放技术:解决ComfyUI模型占用难题的底层API方案 【免费下载链接】ComfyUI-Easy-Use In order to make it easier to use the ComfyUI, I have made some optimizations and integrations to some commonly used nodes. 项目地址: https://gitcode.c…...
