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 **:=** 0**for** 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 **:=** 0**for** 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 代表是函数的名称,函数名由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名称不能重名。

parameter1 和 parameter2 代表是函数的参数,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 = value2**return**}

可以为返回值命名,通过在函数声明中为返回值指定名称和类型。在函数体内,可以直接为这些命名返回值赋值,并在最后使用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)

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

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

相关文章

计算机网络——HTTP

HTTP报文格式长什么样&#xff1f; HTTP报文它是由请求行&#xff0c;请求头&#xff0c;请求体组成的 请求行他是请求或响应的基本信息 请求头他是使用key-value格式可以更加详细的说明报文 请求体是传输的具体内容 是如何分割的&#xff1f; 请求行与请求头他是用\r\n来…

wireshark windows 抓包https

windows下 1.配置环境变量以生成ssl协商会话密钥日志记录 系统设置-》高级设置-》环境变量 新增环境变量 SSLKEYLOGFILE C:\Users\Public\Documents\SSLKEY\sslkey.log 打开公用共享文档创建SSLKEY文件夹用于后续系统存放协商密钥日志 2.配置Wireshark选项进行抓包 点击…

(一)Linux+Windows下安装ffmpeg

一丶前言 FFmpeg是一个开源的音视频处理工具集&#xff0c;由多个命令行工具组成。它可以在跨平台的环境中处理、转换、编辑和流媒体处理音视频文件。 FFmpeg支持多种常见的音视频格式和编解码器&#xff0c;可以对音视频文件进行编码、解码、转码、剪辑、合并等操作。它具有广…

最近火绒的explorer问题,电脑黑屏只有鼠标

由于安全限制&#xff0c;覆盖文件是行不通的&#xff0c;按照火绒官方给的方法试试&#xff0c;还是不行。主要是他最后一步写得有问题。恭喜火绒&#xff0c;成功的将我们所有客户的电脑安装的火绒卸载。 解决方案 1、CTRLSHIFTESC调出任务管理器&#xff1b; 2、左上角&am…

.net使用excel的cells对象没有value方法——学习.net的Excel工作表问题

$exception {"Public member Value on type Range not found."} System.MissingMemberException 代码准备运行问题解决1. 下载别的版本的.net框架2. 安装3. 运行 代码 Imports Excel Microsoft.office.Interop.Excel Public Class Form1Private Sub Button1_Click(…

「实战应用」如何用DHTMLX构建自定义JavaScript甘特图(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 当您声称您的产品具有高级定制功能时&#xff0c;客户一定会对产品进行严格测试&#xff0c;这个规则当然适用于DHTMLX Gantt&…

万用表革新升级,WT588F02BP-14S语音芯片助力智能测量新体验v

万能表功能&#xff1a; 万能表是一款集多功能于一体的电子测量工具&#xff0c;能够精准测量电压、电流、电阻等参数&#xff0c;广泛应用于电气、电子、通信等领域。其操作简便、测量准确&#xff0c;是工程师们进行电路调试、故障排查的得力助手&#xff0c;为提升工作效率…

Rust 中Self 关键字的两种不同用法

在 Rust 中&#xff0c;Self 是一个特殊的类型标识符&#xff0c;它代表了当前结构体或枚举类型。在结构体或枚举类型的定义中&#xff0c;Self 可以用于表示该类型的任何地方&#xff0c;包括方法签名、构造函数、类型别名等。 构造函数中的 Self&#xff1a; 在这段代码中&a…

大语言模型数据集alpaca羊驼数据集、Vicuna骆马数据集异同、作用、使用领域

文章目录 大语言模型数据集alpaca羊驼数据集、Vicuna骆马数据集异同、作用、使用领域Alpaca和Vicuna简介AlpacaVicuna相同点不同点 alpaca、vicuna能否用在大语言模型微调中&#xff1f;alpaca、vicuna进行大语言模型微调时&#xff0c;由于其已经是标准化数据集&#xff0c;还…

奥特曼剧透GPT-5,将在高级推理功能上实现重大进步

奥特曼&#xff1a;“GPT-5的能力提升幅度将超乎人们的想象...” 自 Claude 3 发布以来&#xff0c;外界对 GPT-5 的期待越来越强。毕竟Claude 3已经全面超越了 GPT-4&#xff0c;成为迄今为止最强大模型。 而且距离 GPT-4 发布已经过去了整整一年时间&#xff0c;2023年3月1…

2024年区块链、电子信息与计算机工程国际会议(ICBEICE 2024)

2024年区块链、电子信息与计算机工程国际会议&#xff08;ICBEICE 2024&#xff09; 2024 International Conference on Blockchain, Electronic Information and Computer Engineering 会议简介&#xff1a; 2024年区块链、电子信息与计算机工程国际会议&#xff08;ICBEIC…

Android 源码中 内置系统App(整个APP源码方式集成)

1. 如何新建一个系统 App 项目 使用 Android Studio 新建一个空项目 FirstSystemApp&#xff0c;包名设置为 com.yuandaima.firstsystemapp&#xff0c;语言选择 Java。后面为叙述方便称该项目为 as 项目。 接着在 jelly/rice14 目录下创建如下的目录和文件&#xff1a; 接着…

安卓面试题多线程 96-100

96. 简述notify()和notifyAll()有什么区别 ?notify可能会导致死锁,而notifyAll则不会任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码 使用notifyall,可以唤醒 所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一…

播放器视频卡顿,延迟的原因

之前测试过一些参数&#xff0c;也看到了1280x720就不卡&#xff0c;1920x1080明显就卡的多。那么就是说数据量太大了导致的延迟与卡顿&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 有可能是协议&#xff0c;ffmpeg参数的问题。 还有一个问题&#xff0c;播…

node.js 的常用命令

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它使得 JavaScript 可以脱离浏览器在服务器端运行。在使用 Node.js 进行开发时&#xff0c;有一些常用的命令可以帮助你更高效地进行开发和管理项目。以下是一些基本的 Node.js 命令&#xff1a; 1. node…

金江能源:助力新能源行业发展上市之路逐步迈进

在当今全球节能减排的大背景下,新能源产业成为了社会发展的热门领域。楚雄州金江能源集团有限公司作为新能源产业中的佼佼者,凭借其雄厚的技术实力和前瞻性的发展战略,已经展开了公司上市的蓄势之路。5月15日,金江能源将在港交所上市,为公司的发展注入更多资金和资源。 作为一…

vue axios 缓存 接口请求实现缓存加载

文章写的多了&#xff0c;开头就不知道怎么写了&#xff0c;硬挤一些句子总觉的卖弄。其实更多的想留下各位看官&#xff0c;多多的点赞&#xff0c;多多的关注&#xff0c;多的收藏。为将来的博客化动作做好前期数据粉丝基础。哦哦哦&#xff0c;我在想啥呢。。这大下午的。。…

Three.js简介

Three.js前提须知 讲到 Three.js&#xff0c;就需要先说一下 OpenGL 和 WebGL。 OpenGL 是一个跨平台的3D/2D的绘图标准&#xff08;规范&#xff09;&#xff0c;WebGL&#xff08;Web Graphics Library&#xff09;是一种3D绘图协议。 WebGL允许把JavaScript和OpenGL 结合…

图像处理学习笔记(一)

本文主要介绍&#xff0c;以供读者能够理解该技术的定义、原理、应用。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;ISP处理 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就…

xAI开发的一款巨大型语言模型(HLM)--Grok 1

在xAI发布Grok的权重和架构之后&#xff0c;很明显大型语言模型&#xff08;LLM&#xff09;的时代已经过去&#xff0c;现在是巨大型语言模型&#xff08;HLM&#xff09;的时代。这个混合专家模型发布了3140亿个参数&#xff0c;并且在Apache 2.0许可下发布。这个模型没有针对…