Go基础学习

news2025/1/23 10:30:27

文章目录

  • 回看下历史
  • 环境安装和开发工具:
  • 基础语法:
    • go的注释:
    • 变量
    • 定义:
    • 简短定义模式
    • Go的变量交换
    • 匿名变量(空白标识符):
    • 变量的作用域:
    • iota常量计数器
    • 数据类型
      • 布尔类型
      • 数值型
        • 整数
        • 浮点数
      • 字符串类型
      • 常见的别名:
      • 数据类型转换:
    • 运算符
      • 算术运算符
      • 关系运算符
      • 逻辑运算符
      • 位运算
      • 赋值运算符:
    • 流程控制:
      • 选择
        • if
        • switch
      • 循环
        • for
  • 键盘输入输出
  • 遍历String

回看下历史

谷歌工程师 Rob Pike
图标是他老婆设计的:
一只土拨鼠
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLVg8bf6-1673232842246)(../images/u=2230546833,960574670&fm=253&fmt=auto&app=138&f=JPEG.webp)]

是在2009年11月10日正式开源和发布的。
当然其实核心开发者还有很多,反正都是大佬,就懒得一一写出来了。
反正的语言就是强大的

Go 是一个静态语言类型

环境安装和开发工具:

安装环境:
https://studygolang.com/dl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tBcmhMtG-1673232842247)(../images/Pasted%20image%2020230108101804.png)]

选对应的
下载好之后,按照步骤安装就行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ho3gLNZz-1673232842247)(../images/Pasted%20image%2020230108102121.png)]

装好之后老规矩就可以看到版本

看看环境变量和安装目录和工作目录
安装目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-peQPIpmi-1673232842247)(../images/Pasted%20image%2020230108102338.png)]

工作目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R43D5Zvb-1673232842247)(../images/Pasted%20image%2020230108102523.png)]

保存Go的代码和各种包的
可以通过go env 命令去看看go 的环境变量
开发软件就是Goland

老规矩,写个hello world

package main  
  
import (  
   "fmt"  
   _ "fmt"  
)  
  
func main() {  
   fmt.Println("hello world!")  
}

go的main包是有特殊含义的。一个项目就是只有一个main包。程序在构建过程中会去找main包,在其中也会去寻找main函数。

基础语法:

go的注释:

/*  
注释  
*/  
  
//注释

变量

写在前面:
未使用错误
go语言的神奇之处,编译器会将未使用的局部变量当做错误,虽说知道它的初衷是好的,不过刚开始会难受,但这有助于培养良好的编程习惯。

变量(variable)表示没有固定值且可以改变的数(数学定义),也可以说是一段或者多段用来存储数据的内存。(计算机系统定义)

作为静态类型语言,go变量总是有固定的数据类型,类型决定了变量内存的长度和存储格式,可以改变变量值(类型转换或指针操作),无法改变类型。

定义:

关键字var用于定义变量,类型放在变量名后。运行时内存分配操作会确保变量自动初始化为二进制零值(zero value),避免出现不可控行为。 如显式提供初始化值,可省略变量类型,有编译器推断。

var 变量名 变量类型

var x int     //自动初始化为0
var y = false //自动推断为bool类型

可一次定义多个变量,包括用不同初始值定义不同类型

package main  
  
import (  
   "fmt"  
   _ "fmt"  
)  
  
func main() {  
   fmt.Println("hello world!")  
   var x int     //自动初始化为0  
   var y = false //自动推断为bool类型  
   var name = "simple"  
   name = "thanks"       //改变量  
   var a, b int          //相同类型的多个变量  
   var c, d = 100, "abc" //不同类型的初始化值,这里 c是100 d是abc  
   /*      按照编程习惯,建议以组的方式整理多行变量定义,即用大括号美观一点。  
   */   var (  
      a1, b1 int  
      c1, d1 = 100, "abc"  
   )  
   fmt.Println(name, x, y, a, b, c, d)  
   fmt.Println(a1, b1, c1, d1)  
}

简短定义模式

除var关键词外,还能使用如下模式

func main(){
  x := 100
  a, s :=1, "abc"
}

简短模式限制

  1. 定义变量,同时显式初始化
  2. 不能提供数据类型
  3. 只能用于函数内部
package main  
  
import "fmt"  
  
func main() {  
   x := 1  
   name := "simple"  
   age := 18  
   fmt.Println(x)  
   fmt.Println(name)  
   fmt.Println(age)  
}

简短模式不一定总是重新定义变量,也可能是部分退化的赋值操作。 退化赋值的前提条件是 最少有一个新变量被定义且必须是同一作用域。

func main(){
  x := 100
  println(&x)

  x := 200                      //错误:no new variable on left side of :=
  println(&x, x)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkXdY4dX-1673232842248)(../images/Pasted%20image%2020230108154748.png)]

打印变量的内存地址和类型

func main() {  
   x := 100  
   //输出变量的内存地址和值  
   println(&x, x)  
   fmt.Printf("%d,%p", x, &x)  
   println()  
   //得出变量的类型  
   fmt.Printf("%T", x)  
}

😀

Go的变量交换

package main  
  
import "fmt"  
  
func main() {  
   a := 100  
   b := 200  
   b, a = a, b  
   fmt.Println(a, b)  
}

匿名变量(空白标识符):

为什么会有这个东西?
因为他可以用来增加代码的灵活性。

匿名变量就是一个下划线__

匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。

package main  
  
import "fmt"  
  
func test() (int, int) {  
   return 100, 200  
}  
func main() {  
   a, _ := test()  
   fmt.Println(a)  
  
}

变量的作用域:

局部变量:
函数中定义的就是局部变量。
全局变量:
在函数外定义的就是全局的。

package main  
  
var quanjv = 100  
  
func main() {  
   jvbu := 200  
   println(jvbu)  
   println(quanjv)  
}```

## 常量:
常量的数据类型只可以是布尔类型,数字类型,字符串类型

>const 常量名 常量数据类型 = 值

```go
package main  
  
func main() {  
  
   const name = "simple"  
   println(name)  
}

package main  
  
import "fmt"  
  
func main() {  
   const (  
      //在常量组中如不能指定类型和初始化值,则与上一行非空常量右值(表达式文本)相同。  
      x uint16 = 120  
      y        //与上一行x类型,右值相同  
      s = "abc"  
      z //与s的类型,右值相同  
   )  
  
   fmt.Printf("%T, %v\n", y, y)  
   fmt.Printf("%T, %v\n", z, z)  
}

输出:

uint16, 120
string, abc

iota常量计数器

特殊常量:iota是go 语言中的常量计数器。
iota在const出现时被置为0(const内部的第一行之前),const中每增加一行常量声明将使iota计数一次。


package main  
  
import "fmt"  
  
func main() {  
   const (  
      a = iota  
      b = 3  
      c = iota  
      d  
      e      f   )  
   fmt.Println(a, b, c, d, e, f)  
  
   const (  
      g = iota  
   )  
   fmt.Println(g)  
}

输出:
0 3 2 3 4 5
0

所以可以看见,当常量没有被赋值的时候,就会自动赋值成iota的值
iota会计数每一次定义常量.
定义一次常量iota就加一。

可以看见下一组const中iota会重置为0

数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSXWRtfY-1673232842248)(../images/3.png)]

布尔类型

bool
两个值真和假

数值型

整数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdRBGLRZ-1673232842248)(../images/Pasted%20image%2020230108185539.png)]

package main  
  
import "fmt"  
  
func main() {  
   var age int = 18  
  
   fmt.Println(age)  
   fmt.Printf("%T", age)
   }

浮点数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uc5ctO1q-1673232842249)(../images/Pasted%20image%2020230108185716.png)]

package main  
  
import "fmt"  
  
func main() {  
   var money float64 = 3.14  
   fmt.Printf("%T,%.1f", money, money)   
}

尽量使用float64

字符串类型

定义String

package main  
  
import "fmt"  
  
func main() {  
   //双引号  
   var name string = "simple"  
   fmt.Printf("%T,%s\n", name, name)  
   // 单引号 字符  
   v1 := '1'  
   v2 := 's'  
  
   fmt.Printf("%T,%d\n", v1, v1)  
   fmt.Printf("%T,%s\n", v2, v2)  
   // 字符串拼接  
   fmt.Println("hello " + "world")  
}

输出:

string,simple
int32,49            
int32,%!s(int32=115)
hello world  

双引号是字符串类型
单引号中是单个字符,但是go中没有这样单独的,他直接默认成int32类型。保存的是他的ascii码。

字符串连接是直接用加号拼接

常见的别名:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-43qEWpB6-1673232842249)(../images/Pasted%20image%2020230108185918.png)]

在官方的规范中,专门提到有两个别名:

 byte alis for uint8
 tune alis for int32

别名类型无需转换,可直接赋值。

数据类型转换:

格式:

valueofTypeB = TypeB(valueofTypeA)
说人话就是:
int类型 = int(‘a’)

package main  
  
func main() {  
   a := 5  
   b := float64(a)  
   //c := bool(a) 转化不了的  
   println(a, b)  
  
}

小变大是正常的,但是大变小就会造成精度丢失。

运算符

算术运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2lu2q6r9-1673232842249)(../images/Pasted%20image%2020230108191941.png)]

注意自增和自减只有A++ 或A-- 没有++A --A

关系运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z70J0RUa-1673232842250)(../images/Pasted%20image%2020230108192845.png)]

和其他语言差不多

package main  
  
func main() {  
   a := 10  
   b := 11  
  
   if a == b {  
      println("yes a == b ")  
   } else {  
      println("NO ")  
   }  
  
}

逻辑运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PCdY7Ez-1673232842250)(../images/Pasted%20image%2020230108193345.png)]

位运算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DF9NZRd7-1673232842250)(../images/Pasted%20image%2020230108193518.png)]

赋值运算符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sb5Kl6UX-1673232842250)(../images/Pasted%20image%2020230108193911.png)]

流程控制:

选择

if

package main  
  
func main() {  
   a := 10  
   if a > 10 {  
      print("yes")  
   } else if a == 10 {  
      print("middle")  
   } else {  
      print("no")  
   }  
}

switch

switch默认是自带break的

package main  
  
func main() {  
   x := 100  
   switch x {  
   case 10:  
      print("10")  
   case 100:  
      print("100")  
   case 1000:  
      print("1000")  
   default:  
      print("nono")  
   }  
  
}

如果要取消这个break就需要用fallthroug关键字

package main  
  
func main() {  
   a := true  
  
   switch a {  
   case true:  
      println("yes")  
      fallthrough  
   case false:  
      //if a == true {  
      // print("hell")      //}      print("no")  
   default:  
      print("final")  
   }  
}

可以看到这个关键字,直接到了下一个case不管条件的。

循环

for

package main  
  
func main() {  
   for i := 0; i < 10; i++ {  
      println(i)  
   }  
}

go 的for循环也有break和continue两个关键字。

键盘输入输出

package main  
  
import "fmt"  
  
func main() {  
   var x int  
   var y int  
  
   fmt.Scanf("%d,%d", &x, &y)  
   println(x, y)  
  
  
}

和C、C++ 很像 。

遍历String

package main  
  
import "fmt"  
  
func main() {  
   name := "simple"  
   for i := 0; i < len(name); i++ {  
      fmt.Printf("%c ", name[i])  
   }  
}

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

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

相关文章

新冠COVIN-19流感病患轨迹追溯

实验背景 冬季是流感的高发季节&#xff0c;现已知某流感病毒的传播力很强&#xff0c;政府部门也陆续公开了部分流感确诊患者&#xff08;后续简称“病患”&#xff09;的非隐私信息&#xff0c;这部分数据为相关研究人员研究该流感病毒的传播与防控提供了重要的数据支撑。 然…

Linux网站服务实操练习

作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。创作不易&#xff0c;动动小手…

python:打包package

简介 把模块打包成package&#xff0c;可以进行分发和安装。 packaged的打包和安装一、package层次架构二、 package的打包和安装1. 创建setup.py2. 打包package3. 安装package一、package层次架构 其中mypackage为进行打包的文件夹&#xff0c;文件夹下包含多个脚本&#xff1…

钢铁行业应用APS生产排产系统的好处

1 钢铁行业APS生产排产系统设计的主要业务流程 全局一体化计划&#xff1a;主要负责订单交期评审与应答、销产转换、主生产计划、铁水需求计划&#xff0c;该计划的最终目标是对各个分厂的日计划提出整体要求。主要对口业务部门为公司生产计划排程部门。 各个工段厂区的一体化…

SpringCloud微服务项目实战 - 4.自媒体平台(博主后台)

“我读过很多书&#xff0c;但后来大部分都忘记了&#xff0c;你说这样的阅读究竟有什么意义&#xff1f;” “当我还是个孩子时&#xff0c;我吃过很多食物&#xff0c;现在已经记不起来吃过什么了。但可以肯定的是&#xff0c;它们中的一部分已经长成我的骨头和肉。” 系列文…

LaoCat带你认识容器与镜像(三【上】)

有道是每逢佳节倍惰怠 ~&#xff0c;春节期间随缘更新吧 ~ 本章内容 Docker挂载数据卷相关。 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 前边章节就介绍过Docker数据卷相关的知识点&#xff0c;也特别强调了生产环境一定要记得挂载数据卷&#xff0c;编程的小…

【前端】Vue项目:旅游App-(11)city:添加热门数据、动态修改索引栏、点击跳转、显示城市

文章目录目标过程与代码添加热门数据热门数据样式索引栏索引监听点击、保存数据、回退首页跳转到city页、显示城市效果总代码修改的文件city.jscurrentGroupCity.vuehome.vue目标 上一篇以indexBar的形式显示了数据&#xff1a;【前端】Vue项目&#xff1a;旅游App-&#xff0…

【Kubernetes 企业项目实战】01、使用 kubeadm 安装 K8s-v1.23 高可用集群

目录 K8s-v1.23 安装环境规划 kubeadm 和二进制安装 k8s 适用场景分析 一、初始化安装 k8s 集群的环境 1.1 初步的环境初始化 1.2 配置主机之间无密码登录 1.3 关闭交换分区 swap 提升性能 1.4 修改机器内核参数 1.5 配置阿里云的 repo 源 1.6 配置安装 k8s 组件需要…

python调试器 ipdb

文章目录1. 介绍1.1 常用调试方式1.2 安装 ipdb2. 用法3. 命令3.1、查看源代码3.2、添加断点3.3 添加临时断点3.4 清除断点3.5、打印变量值3.6、逐行调试命令3.7、非逐行调试命令3.8 跳出函数&#xff0c;跳入函数3.9、查看当前函数所有参数3.10 打印变量的值3.11、打印变量类型…

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

【openGauss】在openEuler(ARM架构)上安装openGauss(单机版)

一、系统版本介绍 当前案例中的openGauss安装&#xff0c;底层操作系统为openEuler-20.03-LTS版本&#xff0c;当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本&#xff0c;该实验使用的openEuler版本自带Python 3.7.4&#xff0c;不需要再自行安装 二…

光电探测器怎么选

想要挑选光电探测器&#xff0c;首先应该理解探测器的重要的几个指标。 实际看一个光电探测器吧 输入输出接口三个部分&#xff0c;光纤输入&#xff0c;射频输出&#xff0c;电源供电 数据手册 捡几个难理解的说说&#xff0c;详细推导解释这里不赘述了&#xff0c;难理解的…

【二】Netty 搭建简单的http服务

Netty 搭建简单的http服务Netty 简介代码展示netty 依赖NettyServer netty 服务端启动类MyChannelInitializer 设置编码解码器&#xff0c;并添加自己的业务方法MyClientHandler 实现自己的业务方法。主要方法 是读取到数据后处理效果展示服务端打印截图采用Postman 测试 截图N…

JDBC 实现增删改查的实际操作,很简单

大家好&#xff0c;今天给大家分享一下JDBC 实现增删改查的实际操作 我们还是使用的Maven的方式&#xff0c; 首先要创建一个干净的Maven webapps项目 看这个就可以了 要导入相关的依赖 <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connec…

如何使用 HTML5 Web 连接到 VMware vSphere Hypervisor

本文将向你展示如何在计算机上连接 VMware vSphere Hypervisor 7.0.3,VMware vSphere Hypervisor 7.0.3 也称为 ESXi 7.0.3。 连接 ESXi 7.0.3 下载工具以管理 ESXi 主机服务器连接 ESXi 7.0.3 服务器下载工具以管理 ESXi 主机服务器 现在不需要任何工具来管理 ESXi 7.0.3,从…

1.8周报

SourceURL:file:///home/mrl/文档/1.8周报.docx 周报 代码行数&#xff1a; 周一 611 周二 672 周三 524 周四 528 周五 450 周六 545 周日 564 遇到的问题&#xff1a; 系统配置问题&#xff1a; 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导…

数据脱敏实战经验

1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt3. 创建自定义序列化器&#xff1a;PrivacySerializer4. 隐私数据隐藏工具类&#xff1a;PrivacyUtil5. 注解使用这两天在整改等保测出的问题&#xff0c;里面有一个“用户…

如何将.md文件转换为pdf

目录 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&#xff09; 2.step2&#xff1a; 安装定制化插件 3.step3&#xff1a; 进入预览窗口模式 4.step4&#xff1a; 进行格式转换 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&a…

【实战篇】39 # 如何实现世界地图的新冠肺炎疫情可视化?

说明 【跟月影学可视化】学习笔记。 世界地图新冠肺炎疫情可视化 下面将实现世界地图新冠肺炎疫情可视化。数据用的是从 2020 年 1 月 22 日到 3 月 19 日这些天的新冠肺炎疫情进展。效果类似下图&#xff1a;https://covid19.who.int/ 步骤一&#xff1a;准备世界地图可视化…

[ 数据结构 ] 迪杰斯特拉算法(最短路径问题)

0 最短路径问题 战争时期&#xff0c;胜利乡有 7 个村庄(A, B, C, D, E, F, G) &#xff0c;现在有六个邮差&#xff0c;从 G 点出发&#xff0c;需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) &#xff0c;比如 A – B 距离 5 公里问&#…