当前位置: 首页 > news >正文

go语言-基础元素与结构的使用

go基础元素与结构的使用,快速上手

编译go文件

编译为可执行文件
go build +文件名.go运行文件
./文件名

输入/输出

引用fmt库(关于输入输出的库)

输入

scanf按照给定的格式依次读取数据(包括非法数据),不能换行输入(如果要换行需要在前面加一个scanln吸收掉回车符,就像c语言中的getchar)
scan比scanf高级,依次读取数据,遇到回车会忽略,可以换行输入(如果要先用了scan输入,再用scanf输入的话,需要在中间加一个scanln
scanln类似scan,但是遇到换行(回车)立马结束输入,如果要换行输入必须用多个scanln

package main
import ("fmt"
)
func main() {var a intvar b stringfmt.Printf("place input a: ")fmt.Scanf("%d  %s", &a, &b)i := 0for i < a {fmt.Println(i)i++}fmt.Println(b)
}

输出

print与println与printf

Print: 输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)

fmt.Print(str)

Println: 输出到控制台并换行

fmt.Println(tmp)

Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形 等)

如果是使用"Print"或"Println"函数的话**,可以不需要格式化字符串。**也就是说"Print"或"Println"是已经封装好的printf,他们会帮你自动格式化这些函数会针对数据类型 自动作转换。

Print函数默认将每个参数以"%v"格式输出,

Println函数则是在"Print"函数 的输出基础上增加一个换

printf中的使用的格式化字符串

%v按值的本来值输出
%+v在 %v 基础上,对结构体字段名和值进行展开
%#v输出 Go 语言语法格式的值
%T输出 Go 语言语法格式的类型和值
%%输出 % 本体
%b整型以二进制方式显示
%o整型以八进制方式显示
%d整型以十进制方式显示
%x整型以十六进制方式显示
%X整型以十六进制、字母大写方式显示
%UUnicode 字符
%f浮点数
%p指针,十六进制方式显示

选择结构

if-else


if condition1 {// do something 
} else if condition2 {// do something else    
} else {// catch-all or default
}

实例使用

package main
import "fmt"
func main() {var a int = 100if a > 100 {fmt.Printf("a > 100")} else if a >= 50 && a <= 100 {fmt.Printf("a > 50 and a < 100")} else {fmt.Printf("a is nonono !!!")}
}

switch case

switch var1 {case val1:...case val2:...default:...
}

go中的switch case 相对于 c++中的switch case 来说,

1、变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号 { 必须和 switch 关键字在同一行。

2、可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3

3、 ( Go 语言使用快速的查找算法来测试 switch 条件与 case 分支的匹配情况,直到算法匹配到某个 case 或者进入 default 条件为止。)一旦成功地匹配到某个分支,在执行完相应代码后就会退出,整个 switch 代码块不需要特别使用 break 语句来表示结束。

实例代码:

package main
import ("fmt"
)
func main() {var a intfor true {fmt.Printf("place input a: ")fmt.Scanf("%d", &a)switch a {case 1, 5, 6, 7:fmt.Println("this is 1")case 2:fmt.Println("this is 2")case 3:fmt.Println("this is 3")case 4:fmt.Println("exit")returndefault:fmt.Println("this is not 1,2,3,4")}}
}

循环结构

go中只用一个循环关键字,for,没有while,而是使用for进行通吃。

for有四种写法,对应着不同的使用:

类c/c++中的for:

for init; condition; post { }

实例代码:

package main
import ("fmt"
)
func main() {var a intfmt.Printf("place input a: ")fmt.Scanf("%d", &a)for i := 0; i < a; i++ {fmt.Println(i, "\n")}
}

类c/c++中的while语句:

for condition { }

实例代码:

package main
import ("fmt"
)
func main() {var a intfmt.Printf("place input a: ")fmt.Scanf("%d", &a)i := 0for i < a {fmt.Println(i, "\n")i++}}

类似while(1)

for {}for true{
}

这样将直接执行一个死循环
range 格式(主要应用在切片上,下面切片会具体讲)

for key, value := range oldMap {newMap[key] = value
}

数组

下面是一些示例,说明在Go语言中如何声明和使用数组:

(1) 声明和初始化一个数组:

var a [5]int        // 声明一个长度为5的int类型数组 
a = [5]int{1, 2, 3}  // 将前三个元素初始化为1、2、3,后两个元素默认为0
b := [5]int{1, 2, 3, 4, 5} //直接初始化并赋值

(2) 访问数组元素:

x := a[0]    // 访问第一个元素   
a[2] = 10    // 修改第三个元素

(3) 循环遍历数组:

func sum(a [5]int) int {s := 0for i := 0; i < len(a); i++ {s += a[i]}return s}
x := sum([5]int{1, 2, 3, 4, 5})

(4) 数组作为函数参数传递:

func sum(a [5]int) int {s := 0for i := 0; i < len(a); i++ {s += a[i]}return s}
x := sum([5]int{1, 2, 3, 4, 5})

(5)多维数组:

var a [3][3]int     // 声明一个3x3的二维数组*    
a[0][0] = 1         // 访问第一个元素*

函数

声明格式:

func functionName(parameter1 type, parameter2 type) returnType {// 函数体
}
  • 函数声明:关键字 func
  • functionName 代表是函数的名称,函数名由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名称不能重名。

parameter1parameter2 代表是函数的参数,type 是参数的类型。参数由参数变量和参数变量的类型组成,参数变量可以省略,可以有一个参数,也可以有多个,也可以没有;多个参数之间使用,分隔;多个参数时参数变量要么全写,要么全省略;如果多个相邻参数的类型是一样的,可以只保留同一类型最后一个参数的声明

不同参数的使用

(1) 单个参数:

func functionName**(parameterName parameterType) {// 函数体
}

这是函数接受单个参数的基本形式。parameterName是参数的名称,parameterType是参数的类型。

(2) 多个参数:

func functionName(parameter1Name parameter1Type, parameter2Name parameter2Type) {// 函数体
}

如果函数需要接受多个参数,可以在函数声明中依次列出参数的名称和类型。

(3) 可变参数(Variadic parameters):

func functionName(parameterName ...parameterType) {// 函数体
}

可变参数允许函数接受不定数量的参数。在参数类型之前使用…来指示可变参数的形式。在函数体内,可变参数被当作切片类型来处理。

(4) 参数命名和类型省略:

func functionName(parameter1, parameter2 int) {// 函数体
}

在函数定义中,如果多个参数具有相同的类型,可以省略参数类型,并在最后一个参数上指定类型。这种情况下,所有的参数都将具有相同的类型。

(5) 匿名参数:

func functionName(int, string) {// 函数体
}

在函数定义中,如果不需要使用参数的值,可以将参数名称省略,只保留参数类型。这种形式的参数被称为匿名参数。

  • returnType 是函数的返回值类型。返回值由返回值变量和其变量类型组成,返回值变量可以省略,可以有一个返回值,也可以有多个,也可以没有;多个返回值必须用()包裹,并用,分隔;多个返回值时返回值变量要么全写,要么全省略。下面列举返回类型的不同定义方式:

不同返回值的使用

(1) 单个返回值:

func functionName() returnType {// 函数体return value
}

这是函数返回单个值的基本形式。returnType是返回值的类型,value是要返回的具体值。

(2)多个返回值:

func functionName() (returnType1, returnType2) {// 函数体return value1, value2
}

如果函数需要返回多个值,可以在函数声明中使用括号将多个返回值类型括起来,并在函数体内使用逗号分隔返回的具体值。

(3 命名返回值:

func functionName() (returnValue1 returnType1, returnValue2 returnType2) {// 函数体returnValue1 = value1returnValue2 = value2return}

可以为返回值命名,通过在函数声明中为返回值指定名称和类型。在函数体内,可以直接为这些命名返回值赋值,并在最后使用return关键字返回结果。

(4)空返回值:

如果函数没有返回值,可以省略返回值的类型和具体值,只使用return关键字。

func functionName() {// 函数体return}

结构体

结构体的基本方法:

type MyStruct struct {// 结构体字段Field1 Type1变量名 + 类型// ...
}

基本的赋值操作

使用 var 声明变量

var p1 people
p1.Name = "zq"
p1.Age = 18
p1.Address = "杭州"

使用语法糖定义变量

p2 := people{Name: "zq",Age:   20,Address: "北京",
//变量 + : + 数据
}

初始化结构体

初始化一个结构体实例(一个结构体字面量:struct-literal)的更简短和惯用的方式如下:ms := &struct1{10, 15.5, "Chris"}// 此时ms的类型是 *struct1
或者:var ms struct1ms = struct1{10, 15.5, "Chris"}

实际应用

package main
import "fmt"
type struct1 struct {i1  intf1  float32str string
}
func main() {ms := new(struct1)ms.i1 = 10ms.f1 = 15.5ms.str= "Chris"fmt.Printf("The int is: %d\n", ms.i1)fmt.Printf("The float is: %f\n", ms.f1)fmt.Printf("The string is: %s\n", ms.str)fmt.Println(ms)
}

切片

切片就类似与c++中的STL中vector,是一个动态数组,它长度是不固定的,可以追加元素,在追加时可能使切片的容量增大, 但是需要注意的是切片是引用类型,例如:当你将一个切片赋值给另一个切片时,它们将引用同一个底层数组。如果一个切片被修改,另一个引用该底层数组的切片也会受到影响。

切片的声明

直接声明切片:

var slice []T

T 是切片中元素的类型。例如,[]int 表示一个整数类型的切片,[]string 表示一个字符串类型的切片。
使用make来进行声明指定类型,长度,与容量

var slice1 []type = make([]type, len,capacity)也可以简写为
slice := make([]T, length, capacity)

对切片的基本操作

对于访问与修改元素

  • 可以使用索引访问切片中的元素:

    a := slice[4]
  • 也可以使用索引修改切片中的元素:

    slice[4] = 87
    

获取切片的长度(元素个数):

length := len(slice)

获取切片的容量(底层数组可容纳的元素个数):

capacity := cap(slice)

切片的切割:

获取原切片的一个子切片:

newSlice := slice[start:end]  // 包含 start 索引,不包含 end 索引myslice := slice[1: 5]   //得到slice[1],slice[2],slice[3],slice[4]

如果省略 start,则表示从切片的开头开始切割

newSlice := slice[:end]  // 从开头切割到 end 索引(不包含 end)

如果省略 end,则表示从切片的 start 索引开始切割到末尾:

newSlice := slice[start:]  // 从 start 索引开始切割到末尾

切片的追加:

使用 append() 函数向切片末尾追加一个或多个元素:

slice = append(slice, element1, element2, ...)

切片的复制:

使用 copy() 函数将一个切片的内容复制到另一个切片:

copy(destSlice, srcSlice)

遍历切片:

使用 for range 循环遍历切片中的元素:

for index, value := range slice {// 使用 index 和 value}

index 是一个整数类型的变量,用于表示当前元素的索引。

value 是切片中当前元素的值。

slice 是要遍历的切片。

在每次循环中,会自动得到下一个索引与值,给予index与value,这样我们就能对其进行操作了

对于其是直接赋值给了index与value的因此如果我们直接对value进行修改是不会对我们的value的值发送改变的。

如果我们要直接进行修改,直接通过索引访问到指定的元素即可

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}for index := range numbers {if index == 0 {numbers[index] = 10}}fmt.Println(numbers)
}

参考

Go 语言切片(Slice) | 菜鸟教程 (runoob.com)

相关文章:

go语言-基础元素与结构的使用

go基础元素与结构的使用&#xff0c;快速上手 编译go文件 编译为可执行文件 go build 文件名.go运行文件 ./文件名输入/输出 引用fmt库&#xff08;关于输入输出的库&#xff09; 输入 scanf按照给定的格式依次读取数据&#xff08;包括非法数据&#xff09;&#xff0c;不…...

【leetcode热题】 二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []解法一 题…...

康奋威科技邀您到场参观2024长三角快递物流展

参展企业介绍 杭州康奋威科技股份有限公司创立于2005年&#xff0c;由国家“万人计划”专家任天挺先生创立并担任法人&#xff0c;是一家专业从事智能装备研发与制造的国家级高新技术企业。专注于自动化控制、机械设计、信息化方面的技术研究&#xff0c;主要为太阳能光伏、智…...

linux centos 安装jenkins,并构建spring boot项目

首先安装jenkins&#xff0c;使用war包安装&#xff0c;比较简单&#xff0c;注意看下载的版本需要的JDK版本&#xff0c;官网下载https://www.jenkins.io/download/ 把下载好的war包放到服务器上&#xff0c;然后运行&#xff0c;注意8080端口的放行 # 前台运行并指定端口 ja…...

是德科技keysight DSOX3024T示波器

181/2461/8938产品概述&#xff1a; DSOX3024T 示波器 要特性与技术指标 使用电容触摸屏进行简洁的触控操作&#xff1a; •提高调试效率 •触控设计可以简化文档记录 •使用起来就像您喜欢的智能手机或平板电脑一样简单 使用 MegaZoom IV 技术揭示偶发异常&#xff1a; •超快…...

C#获取HTML源码

C#获取HTML源码 2024年03月23日记录 以前的那个从网上找到的方法, 在一些网站上用不了&#xff0c;如17K&#xff0c;取出来的是乱码&#xff0c;要么就是一坨JS&#xff0c;好像是用JS又重新加载了什么的 using System; using System.Collections.Generic; using System.We…...

element-ui checkbox 组件源码分享

简单分享 checkbox 组件&#xff0c;主要从以下三个方面来分享&#xff1a; 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性&#xff0c;绑定的值&#xff0c;类型 string / number / boolean&#xff0c;无…...

JavaEE--小Demo--数据库建立

目录 实验准备 本次所要新建的文件 实验步骤 step1-demo.sql 1.在resources文件夹下新建demo.sql文件 2.打开此目录&#xff0c;并运行命令提示符 3.打开数据库mysql -uroot -p 4.创建数据库create database demo; 5.使用数据库use demo; 6.导入数据source demo.sql;…...

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记19_前方的路

1. 技术与财富分配不均 1.1. 当前的财富分配不均早已成为世界难题 1.1.1. 世界上有一半的人口——相当于35亿人——拥有的财富却不敌在一辆双层巴士上的商业精英的个人财富总和 1.2. 部分线上市场仍受到竞争机制支配的事实并不能为其他市场的反竞争策略开脱 1.3. 企业的市场…...

MySQL双一参数性能测试

MySQL双一参数 MySQL 数据库中有两个非常重要的参数&#xff0c;一个是innodb_flush_log_at_trx_commit&#xff0c;另外一个是sync_binlog&#xff0c;这两个参数称之为双一参数&#xff0c;前者控制了redo log 的刷盘机制&#xff0c;后者控制了binlog 的刷盘机制 这两个参…...

CodeSys创建自定义的html5控件

文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料&#xff1a;https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子&#xff1a;https://forge.codesys.com/…...

Xcode15报错: SDK does not contain ‘libarclite‘

pod lib lint *** 报错 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target 或者xcode…...

矩阵快速幂

快速幂 #include<iostream> using namespace std;int main(){int a, b, p;cin>>a>>b>>p;int res 1 % p;while(b){if(b & 1) res 1ll * res * a % p;a 1ll * a * a % p;b >> 1;}cout<<res;return 0; }斐波那契数列 #include <ios…...

数据之谜:解读Facebook的用户行为

在当今数字化时代&#xff0c;社交媒体平台已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交网络之一&#xff0c;其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为&#xff0c;并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…...

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景&#xff1a; 自2024年1月起&#xff0c;大部分时间就在家里度过了&#xff0c;想着还是需要充实一下自己&#xff0c;我是一个充满热情的个体。由于之前公司也和帆软结缘&#xff0c;无论是 Fine-Report 和 Fine-BI 都有接触3年之久&#xff0c;但是主要做为管理者并…...

《过滤器模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 本章简要说明过滤器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案&#xff1a; 过滤器模式是一种结构型设计模式&#xff0c;用于过滤一组对象&#xff0c;基…...

【C++】如何用一个哈希表同时封装出unordered_set与unordered_map

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.哈希桶源码 2.哈希…...

Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注&#xff08;CTF题型&#xff09; PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…...

web安全之:三种常见的Web安全威胁

Web安全是确保Web应用和用户数据安全的一系列措施和实践。了解和防御常见的安全威胁是每个Web开发人员的基本职责。下面&#xff0c;我们将详细讨论三种常见的Web安全威胁&#xff1a;SQL注入、跨站脚本&#xff08;XSS&#xff09;和跨站请求伪造&#xff08;CSRF&#xff09;…...

C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序

1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...