Go基础(待更新)

Go基础(待更新)

参考Go 语言教程

文章目录

  • Go基础(待更新)
      • 一、基本语法
        • 1、格式化输出
        • 2、声明并赋值
          • 1)单变量赋值
          • 2)多变量赋值
      • 二、math工具包的使用
      • 三、函数
        • 1、参数传递
          • 1)普通传递
          • 2)指针传递
      • 四、类型转换
      • 五、面向对象
        • 1、结构体
        • 2、封装
        • 3、继承
        • 4、多态
      • 六、集合
        • 1、List
          • 1)遍历list中的对象

一、基本语法

1、格式化输出

参考

  • go语言中的输出语句
  • Go语言 - fmt包 | 输出 | 占位符

格式化输出:printf("%v mod %v = %v",a,b,c)

package mainimport "fmt"func main(){fmt.Print("My weight on the surface of Mars is ")fmt.Print(149.0 * 0.3783)fmt.Print(" lbs, and I would be ")fmt.Print(41 * 365 / 687)fmt.Print(" years old.")fmt.Println()fmt.Println("My weight on the surface of Mars is", 149.0 * 0.3783, "lbs, and I would be", 41 * 365.2425/687, "years old.")// 格式化打印fmt.Println("------------------------------------格式化打印--------------------------------")fmt.Printf("My weight on the surface of Mars is %v lbs,", 149.0 * 0.3783)fmt.Printf(" and I would be %v years old.\n", 41 * 365 / 687)fmt.Printf("My weight on the surface of %v is %v lbs.\n", "Earth", 149.0)fmt.Println("-------------使用Printf对齐文本-----------")fmt.Printf("%-15v $%4v\n", "SpaceX", 94)fmt.Printf("%-15v $%4v\n", "Virgin Galactic", 100)}
// Print、Println函数可以传递若干个参数,参数之间可以用逗号隔开
// 参数可以是字符串、数字、数学表达式等
// 格式化打印:可以使用Printf来控制打印的输出结果,与Print和Println不同,Printf的第一个参数必须是字符串。// 这个字符串中包含了像%v这样的格式化动词,它的值由第二个参数的值所代替。// 如果指定了多个格式化动词,那么它们的值由后面的参数值按顺序进行替换。// 使用Printf对齐文本// 在格式化动词中指定宽度,就可以对齐文本。例如:%4v就是向左填充足够4个宽度// 正数:向左填充空格// 负数:向右填充空格
---
My weight on the surface of Mars is 56.3667 lbs, and I would be 21 years old.
My weight on the surface of Mars is 56.3667 lbs, and I would be 21.79758733624454 years old.
------------------------------------格式化打印--------------------------------
My weight on the surface of Mars is 56.3667 lbs, and I would be 21 years old.
My weight on the surface of Earth is 149 lbs.
-------------使用Printf对齐文本-----------
SpaceX          $  94
Virgin Galactic $ 100
2、声明并赋值

参考go语言的变量声明并赋值运算符(:=)

1)单变量赋值

eg1: 第8行声明并赋值变量a失败,因为变量a已经在第6行声明过了。

$ cat main.c
package mainimport "fmt"func main() {var a int = 100fmt.Printf("&a=%p\n", &a);a := 100  //报错fmt.Printf("&a=%p\n", &a);
}$ go build && main
# main
./main.go:8: no new variables on left side of :=

eg2: 虽然在第5行有声明了一个全局变量a,在第9行依然可以声明并赋值变量a,此时的a和全部变量a不是一个变量,打出来的地址不相同。

$ cat main.c
package mainimport "fmt"var a int = 100func main() {fmt.Printf("&a=%p\n", &a);a := 100 fmt.Printf("&a=%p\n", &a);
}$ go build && main
&a=0x4f8018
&a=0xc42000e268
2)多变量赋值

eg3: 第10行已经声明了变量a,**第12行就不在重新定义变量a,只定义了变量b;**可以看到两个a打印出来的是同一个。

$ cat main.c
package mainimport "fmt"func foo() (int, int) {return 100, 200
}func main() {var a int = 0;fmt.Printf("&a=%p\n", &a);a, b := foo()fmt.Printf("&a=%p, &b=%p\n", &a, &b);
}$ go build && main
&a=0xc42000e260
&a=0xc42000e260, &b=0xc42000e280

二、math工具包的使用

参考go语言基础 数学包 math

package mainimport ("fmt""math"
)func main() {/*math包:*/i := -100fmt.Println(math.Abs(float64(i))) //绝对值fmt.Println(math.Ceil(5.0))       //向上取整fmt.Println(math.Floor(5.8))      //向下取整fmt.Println(math.Mod(11, 3))      //取余数,同11%3fmt.Println(math.Modf(5.26))      //取整数,取小数fmt.Println(math.Pow(3, 2))       //x的y次方fmt.Println(math.Pow10(4))        // 10的n次方fmt.Println(math.Sqrt(8))         //开平方fmt.Println(math.Cbrt(8))         //开立方fmt.Println(math.Pi)
}

三、函数

参考

  • Go 语言函数

  • go语言:函数参数传递详解

1、参数传递
1)普通传递

eg1:

package main
import ("fmt"
)
func swap(a int, b int) {var temp inttemp = aa = bb = temp
}
func main() {x := 5y := 10swap(x, y)fmt.Print(x, y)
}
---
输出结果:5 10

eg2:

/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {/* 声明局部变量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result
}
2)指针传递

函数的变量不仅可以使用普通变量,还可以使用指针变量

package main
import ("fmt"
)
func swap(a *int, b *int) {var temp inttemp = *a*a = *b*b = temp
}
func main() {x := 5y := 10swap(&x, &y)fmt.Print(x, y)
}
---
输出结果:10 5

四、类型转换

参考Go 语言类型转换

go 不支持隐式转换类型(!!!),比如 :

package main
import "fmt"func main() {  var a int64 = 3var b int32b = afmt.Printf("b 为 : %d", b)
}
此时会报错cannot use a (type int64) as type int32 in assignment
cannot use b (type int32) as type string in argument to fmt.Printf

但是如果改成 b = int32(a) 就不会报错了:

package main
import "fmt"func main() {  var a int64 = 3var b int32b = int32(a)fmt.Printf("b 为 : %d", b)
}

五、面向对象

参考Go语言没有类怎么面向对象

1、结构体

https://www.runoob.com/go/go-structures.html

package mainimport "fmt"type Books struct {title stringauthor stringsubject stringbook_id int
}func main() {// 创建一个新的结构体fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})// 也可以使用 key => value 格式fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})// 忽略的字段为 0 或 空fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})
}
2、封装
type Employee struct {Name stringSex  stringAge  int
}func (e *Employee) ToString() string {return "name=" + e.Name + ";sex=" + e.Sex + ";age=" + strconv.Itoa(e.Age)
}
3、继承

Go里面也没有像Java中类似extend继承的语法,Go是用了类似Java里组合的东西来让语法看起来像继承:

type TechEmployee struct {EmployeeSalaryPerMonth float32
}type SaleEmployee struct {EmployeeBaseSalary float32ExtraRate  float32
}

对应的实例化和使用:

//实例化时,是传了个employee
tech := object.TechEmployee{Employee:       object.Employee{Name: "lee"},SalaryPerMonth: 10000,
}
//这里看起来像拥有了Employee的name属性,可以设置和访问
tech.Name = "bruce lee"
fmt.Println(tech.Name)
4、多态
type TechEmployee struct {EmployeeSalaryPerMonth float32
}func (e *TechEmployee) CalcSalary() float32 {return e.SalaryPerMonth
}type Machine struct {}func (e *Machine) CalcSalary() float32 {return 0
}

在Java里比较直观,语法里直接写着实现xxx接口,Go相比的话,没那么直观,但更灵活,它没有指定实现哪个接口,而是如果定义了一个相同名字和返回值的方法,就认为是实现了对应拥有这个方法的接口,这里假如接口有两个方法,对应也必须要两个方法都有定义了,才认为是实现了接口。

六、集合

1、List

参考Go标准容器之List

package mainimport ("container/list""fmt"
)func main() {nums := list.New()nums.PushBack(1)nums.PushBack(2)nums.PushBack(3)for e := nums.Front(); e != nil; e = e.Next() {fmt.Println(e.Value)}
}
1)遍历list中的对象

参考关于go语言集合中Element转换为自定义结构体的方法

Element中Value存放的是接口,所以只要将接口转换为结构体问题就都解决了,其中conn为返回的结构体,而OK是布尔型表示有没有转换成功,true为成功。

conn , ok := (i.value).(net.Conn)

eg:

for e := testCases.Front(); e != nil; e = e.Next() {fmt.Printf("#################### testcase%v ##################\n",i)t := (e.Value).(testCase)A_w,A_j,B_w,B_j,L,bearing := t.A_w,t.A_j,t.B_w,t.B_j,t.L,t.bearing
}

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

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

相关文章

proxy 属性与方法

proxy 属性与方法实例 proxy 属性与方法 proxy 是 JavaScript 中的一个内置对象,它提供了一种机制来拦截并自定义对象的基本操作。 通过使用 proxy,我们可以在对象上定义自定义行为,例如拦截属性访问、函数调用、构造函数调用等。 proxy 对…

C++ 统计一个字符串当每个字符出现的权重。

abbccc$b b:2 本题目为第一步&#xff0c;读入待编码字符串&#xff0c;建造一个森林&#xff0c;请补全下列代码。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef char elemtype; //带权值的二叉树 typedef struct BiTNode{ elemtyp…

使用 rosdep 管理 ROS 2 依赖项

系列文章目录 文章目录 系列文章目录前言 清华源镜像使用一、什么是 rosdep&#xff1f;二、关于 package.xml 文件的一些小知识三、rosdep 是如何工作的&#xff1f;四、如何知道在 package.xml 中输入哪些 key &#xff1f;五、如何使用 rosdep 工具&#xff1f;5.1 rosdep 安…

力扣 141.环形链表和142.环形链表2

目录 1.环形链表Ⅰ解题思路2.环形链表Ⅰ代码实现3.环形链表Ⅱ解题思路4.环形链表Ⅱ代码实现 1.环形链表Ⅰ解题思路 利用快慢指针&#xff0c;快指针一次走两个&#xff0c;慢指针一次走一个&#xff0c;如果出现了快指针为空或者快指针的next为空的现象则说明不带环&#xff0…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本&#xff0c;而dnmp只支持到php8.0。安装php8.2的步骤如下&#xff1a; 1. 从/services/php80目录复制一份出来&#xff0c;重命名为php82&#xff0c;extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

4 Tensorflow图像识别模型——数据预处理

上一篇&#xff1a;3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型&#xff0c;内容较多&#xff0c;会分为多个章节介绍。模型构建还是和之前一样的流程&#xff1a; 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中&#xff0c;std::thread是一个重要的类&#xff0c;它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

1822_使用python内置的库进行日期序列的生成

使用python的内置的库进行日期序列的生成 用到的库介绍 datetime 实现这样的功能其实只需要这一个库就够了&#xff0c;但是网络上找到的例程很多都额外增加了对time库的引用。只能说&#xff0c;这样不会出现错误&#xff0c;但是这样肯定会有一些计算资源上的消耗。 #!/u…

零信任网络:一种全新的网络安全架构

随着网络技术的不断发展&#xff0c;网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证&#xff0c;但这种信任策略存在一定的局限性。为了解决这一问题&#xff0c;零信任网络作为一种全新的网络安全架构&#xff0c;逐渐受到人们的关注。本文将对零信任网络的概念…

MATLAB算法实战应用案例精讲-【图像处理】数字图像处理

目录 几个高频面试题目 图像分类、图像识别、目标检测的优缺点分析与算法比较 知识储备

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

同步网盘与云盘:哪个更好用?

同步网盘、同步云盘现在是热门的文件管理工具&#xff0c;在回答“同步网盘云盘哪个好用”这个问题之前&#xff0c;我们需要知道什么样的同步网盘、同步云盘算好用&#xff1f; 什么样的同步网盘云盘好用&#xff1f; 1、存储空间大 对于文件管理工具而言&#xff0c;存储空…

ORM-1 字段默认值

当在odoo页面新建一条记录的时候&#xff0c;前端会通过rpc调用后端模型的default_get 函数&#xff0c;根据前端传入的字段列表&#xff0c;来获取相对应的字段默认值。# odoo/models.pyapi.modeldef default_get(self, fields_list):""" default_get(fields_l…

[Hive] Map类型在表中是如何存储的

在 Hive 中&#xff0c;Map 类型是指键值对的集合&#xff0c;其中键和值都可以是任意数据类型。 在 Hive 表中&#xff0c;Map 类型通常被存储为结构体或者键值对列表。 具体来说&#xff0c;在表中&#xff0c;Map 类型通常分为以下两种存储方式&#xff1a; 文章目录 结构…

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server&#xff0c;TiKV&#xff0c;TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP

思考的起点(一): 事实与判断

事实与判断是思考的主要组成部分&#xff0c;深入理解事实与判断的基本概念&#xff0c;了解其应用可以提升个体的思考质量; 关于事实真相 事实是认知的基础 1.很多事情没有真相, 或者说真相陷入历史的迷雾中, 无法被发现; 2.世界不需要真相&#xff0c;真相往往都是复杂又残…

Go并发编程

一、goroutine 和 通道 在Go语言中&#xff0c;每一个并发执行的活动成为goroutine。通道则是每一个goroutine之间传递消息的工具。 1、Goroutine 在一个Go程序中&#xff0c;只有一个主Goroutine来调用main函数。生成新的goroutine也十分简单&#xff0c;例如有一个函数&…

GZ035 5G组网与运维赛题第9套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第9套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

springboot actuator jvm监控丢失

1、背景 系统接入了监控prometheus和grafana&#xff0c;某天grafana突然发现只有几台机器可以看到指标。 随便点击一个地址http://192.168.0.76:8681/lms/actuator/prometheus访问指标&#xff0c;发现JVM相关指标全部丢失 2、解决方法 从网上查找相关资料&#xff0c;逐一…