go语言快速入门

代码仓库

gitee

如何运行

以打印hello world为例

// main.go
package main // package为main的文件可以直接运行import "fmt"func main() {fmt.Println("Hello, World!")
}
# 直接运行
go run main.go
# 或者编译后运行
go build main.go
./main.exe

变量定义和数据类型

变量是一个指向内存中某个地址的标识符, 一般用来存放数据.
数据类型就是表示某个变量的类型, 类型决定这个变量在内存中所占的空间大小.
赋值就是将数据(值)存放到变量所指向的地址中, 后续就可以用这个变量来获取该数据

package mainimport "fmt"func main() {// 声明并初始化一个整数变量var age int = 25fmt.Println("Age:", age)// 声明并初始化一个浮点数变量var height float64 = 1.75fmt.Println("Height:", height)// 声明并初始化一个字符串变量var name stringname = "Alice"fmt.Println("Name:", name)// 声明并初始化一个布尔变量isStudent := true // 自动类型推断, 最常用的声明变量的方式fmt.Println("Is student:", isStudent)
}

流程控制

流程控制就是定义我们程序的执行顺序

顺序

顺序执行就从上到下依次执行, 这个是我们程序的正常执行流程

package mainimport "fmt"func main() {fmt.Println("Step 1")fmt.Println("Step 2")fmt.Println("Step 3")
}

选择

选择就是根据满足不同的条件来执行不同的代码
选择的流程分为单分支和多分支

单分支

单分支指的是只有一个分支节点, 只有一次条件判断

package mainimport "fmt"func main() {var score int = 85if score >= 60 {fmt.Println("Pass")} else {fmt.Println("Fail")}
}

多分支

多分支则是有多个分支节点, 多个条件判断

package mainimport "fmt"func main() {var score int = 85if score >= 90 {fmt.Println("A")} else if score >= 80 {fmt.Println("B")} else if score >= 70 {fmt.Println("C")} else {fmt.Println("D")}
}

循环

循环表示一个重复执行的过程

package mainimport "fmt"func main() {// 定义临时变量i, 初始值为1, 循环条件为i小于等于5for i := 1; i <= 5; i++ {fmt.Println(i)}
}

函数

函数的本质是一个闭包, 有自己的作用域
我们可以用函数定义一段代码, 接收0或多个输入, 执行函数体内的代码, 在结束时返回0或多个输出
使用函数可以提取公共逻辑, 简化我们的代码

package mainimport "fmt"// 定义一个函数,接收两个整数参数,返回它们的和
func add(a int, b int) int {return a + b
}func main() {result := add(5, 3)fmt.Println("Result:", result) // 输出: Result: 8
}

类/结构体

类/结构体

类是一个包含了数据和方法(函数)的抽象结构, 我们可以定义它, 要使用类, 需要将类实例化, 其实就是在内存中开辟指定大小的空间来保存它
类的大小取决于内部定义什么数据(比如int), 编译器会自动根据数据大小来决定分配多少空间
一个类可以有多个实例化对象, 也就是有多个不同变量, 但是这些变量都和这个类的结构一致

package mainimport "fmt"// 定义一个结构体 Person,包含 Name 和 Age 字段
type Person struct {Name stringAge  int
}// 为 Person 添加一个方法 SayHello
func (p Person) SayHello() {fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}func main() {// 创建一个 Person 实例person := Person{Name: "Alice", Age: 25}// 调用方法person.SayHello() // 输出: Hello, my name is Alice and I am 25 years old.
}

接口

package mainimport "fmt"// 定义一个接口 Animal,包含一个 Speak 方法
type Animal interface {Speak() string // 所有实现 Speak() 方法的类型都可以看作是 Animal 类型
}// 定义一个结构体 Dog
type Dog struct {Name string
}// 为 Dog 实现 Speak 方法
func (d Dog) Speak() string {return "Woof! My name is " + d.Name
}// 定义一个结构体 Cat
type Cat struct {Name string
}// 为 Cat 实现 Speak 方法
func (c Cat) Speak() string {return "Meow! My name is " + c.Name
}func main() {// 声明一个 Animal 接口变量var a Animal// 创建一个 Dog 实例dog := Dog{Name: "Buddy"}a = dog // 因为 Dog 实现了 Animal 接口,所以可以赋值给 afmt.Println(a.Speak()) // 输出: Woof! My name is Buddy// 创建一个 Cat 实例cat := Cat{Name: "Whiskers"}a = cat // Cat 同样实现了 Animal 接口fmt.Println(a.Speak()) // 输出: Meow! My name is Whiskers// 可以将不同类型的对象统一处理animals := []Animal{dog, cat}for _, animal := range animals {fmt.Println(animal.Speak())}
}

框架

为了简化开发, 程序员会提取公共逻辑, 封装成函数, 或者封装成类和方法, 简化开发, 在这个不断简化的过程中就诞生了框架
不过以我的理解, 库(library)是提取公共方法和类的工具集合, 用户可以以自己的喜好添加很多不同的库来使用; 而框架(framework)
更像是定义了一套项目规范和模板,然后用户在框架的基础上遵守框架约定的标准或结构进行开发; 不过很多时候这个界限不是很清晰,
两个词经常混用

web

我们目前写的程序都是在本地运行的, 为了让世界各地的用户也能使用, 就需要开放到网络, 而web框架, 就是封装了语言本身提供的网络库,
然后提供了开放网络服务的各种方法
go语言常用的web框架为gin

go get "github.com/gin-gonic/gin"
package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建一个默认的路由引擎r := gin.Default()// 定义一个 GET 接口r.GET("/hello", func(c *gin.Context) {c.JSON(200, gin.H{"message": "Hello from Gin!",})})// 启动 HTTP 服务,默认在 0.0.0.0:8080r.Run(":8080")
}

访问localhost:8080/hello查看

db

我们目前都是使用变量来存储数据, 但是变量的数据是放在内存中的, 一旦程序停止, 内存中的数据就会被回收, 下一次启动程序,
操作系统分配的也可能是另一个内存空间, 所以我们需要持久化存储我们的数据, 这就需要用到数据库系统

go语言常用的数据库框架为gorm

go get "gorm.io/driver/sqlite" "gorm.io/gorm" "github.com/glebarez/sqlite"
package mainimport ("github.com/glebarez/sqlite"// 需要 go env -w CGO_ENABLED=1// 并且需要gcc, 不过这个是官方实现, 比较好// "gorm.io/driver/sqlite""gorm.io/gorm"
)// 定义一个结构体,对应数据库表
type User struct {gorm.ModelName  stringEmail string `gorm:"unique"`
}func main() {// 连接 SQLite 数据库(文件名为 test.db)db, err := gorm.Open(sqlite.Open("./dev.db"), &gorm.Config{})if err != nil {panic("failed to connect database")}// 自动迁移 schemadb.AutoMigrate(&User{})// 创建记录db.Create(&User{Name: "Alice", Email: "alice@example.com"})// 查询记录var user Userdb.Where("name = ?", "Alice").First(&user)println("Found user:", user.Name)// 更新记录db.Model(&user).Update("Name", "Bob")// 删除记录db.Delete(&user)
}

扩展

○ 多线程/微服务/反射-动态代理/文件操作/网络编程/
○ 框架的原理/手写
○ wasm/grpc

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

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

相关文章

使用麒麟V10操作系统的KVM服务,但麒麟V10存在高危漏洞无法修复?

麒麟V10操作系统之KVM部署虚拟机_麒麟v10安装kvm-CSDN博客文章浏览阅读3.7k次&#xff0c;点赞30次&#xff0c;收藏25次。本文介绍了在麒麟V10操作系统上部署KVM虚拟机的详细步骤&#xff0c;包括检查虚拟化支持、安装KVM组件、创建虚拟机、配置网络桥接&#xff0c;以及解决可…

PG、SprinBoot项目报错,表不存在

1、用户名密码错误 2、数据库IP和数据库名称错误 3、类似于如下的表结构 PG 默认扫描PUBLIC下面的表&#xff0c;需要手动指定schema&#xff0c;currentSchemaswdn_new url: jdbc:postgresql://${PGSQL_HOST:127.0.0.1}:${PGSQL_PORT:5432}/swdn_new?currentSchemaswdn_ne…

python类成员概要

python类成员概要 python类成员分类如图&#xff1a; 简要说明&#xff1a; 1.实例变量&#xff08;Instance Variables&#xff09; 定义&#xff1a;在方法中通过 self.变量名 声明&#xff0c;属于单个实例 特点&#xff1a;每个实例拥有独立副本&#xff0c;在实例间不共…

Java性能问题排查

1. Java 性能排查 使用JPS查看当前Java进程 jps #查询需要排查的Java进程ID查看Java进程内最耗费CPU的线程资源使用情况 top -H -p <Java进程pid>ps -Lfp <Java进程pid>ps -mp <Java进程pid> -o THREAD, tid, time根据第1步查询出的PID&#xff0c;通过jstac…

基于OpenCV和深度学习实现图像风格迁移

文章目录 引言一、准备工作二、代码实现解析1. 读取和显示原始图像2. 图像预处理3. 加载和运行风格迁移模型4. 处理输出结果 三、效果展示四、扩展应用五、总结 引言 图像风格迁移是计算机视觉中一个非常有趣的应用&#xff0c;它可以将一幅图像的内容与另一幅图像的艺术风格相…

SwiftUI隐藏返回按钮保留右滑手势方案

SwiftUI 隐藏返回按钮但保留右滑返回手势的方案 在 SwiftUI 中&#xff0c;如果你使用&#xff1a; .navigationBarBackButtonHidden(true)可以隐藏系统返回按钮&#xff0c;但会发现 右滑返回手势&#xff08;边缘返回&#xff09;失效了。 这是因为 SwiftUI 底层使用了 UI…

练习小项目11:鼠标跟随小圆点

&#x1f3af; 项目目标&#xff1a; 当鼠标在页面移动时&#xff0c;小圆点会跟随鼠标移动的位置&#xff0c;带有平滑动画。 &#x1f9e0; 实现思路&#xff1a; HTML&#xff1a; 页面内放一个 div 作为圆点。 CSS&#xff1a; 圆点使用绝对定位&#xff0c;初始在屏幕…

华为:eSight网管平台使用snmp纳管交换机

一、SNMP简介 SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种用于管理和监控网络设备的标准协议&#xff0c;广泛应用于路由器、交换机、服务器、打印机等网络设备的管理场景。以下是对它的简单介绍&#xff1a; 1、SNM…

【单片机期末】接口及应用

一、C51语言基础 【考点】存储类型 data是低128字节 code是ROM idata是高128字节 pdata是外部RAM可以用R0 R1寻址的&#xff0c;也叫页 xdata是外部RAM&#xff0c;可以用DPTR寻址或总线扩展 其中data、code、idata、pdata、xdata均为字节类型的&#xff0c;bdata是对位寻址的 …

C#迭代器

文档 C# Iterators 关键内容 普通接口 public interface IEnumerable {IEnumerator GetEnumerator(); }public interface IEnumerator {object Current { get; }bool MoveNext();void Reset(); }泛型接口 public interface IEnumerable<out T> : IEnumerable {IEnum…

Java多线程:为什么wait()必须用循环而非if?

在Java多线程编程中&#xff0c;调用wait()方法时应使用**循环结构&#xff08;while循环&#xff09;**而非if块&#xff0c;这是由线程同步的特性和潜在风险决定的。以下是具体原因和实现规范&#xff1a; 一、正确调用方式 synchronized (lockObject) {while (!condition) …

Fiori 初学记录----怎么调用后端系统odata 服务实现简单的CURD

1.对上面的内表做一个简单的增删改查的操作 SEGW 创建odata 项目&#xff0c;实现增删改查方法。如下图 2.odata 准备完毕后&#xff0c;打开vscode 下一步等待项目生成 把下面这个目录的视图&#xff1a;替换一下&#xff1a; View1.view.xml 代码&#xff1a; <…

OpenCV CUDA模块图像变形------对图像进行GPU加速的仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于对图像进行 GPU 加速的仿射变换&#xff08;Affine Transformation&#xff09;&#xff0c;是 cv::warpAffine 的 CUDA 版本。支持平…

语音增强方法

一、音量增强 音量增强&#xff0c;顾名思义就是音量的调大和调小&#xff0c;通过对音量进行增强可以使得模型更好的泛化。防止数据只有小音量时&#xff0c;当有大音量传入时模型不能很好的进行识别。 下面是我对音量增强生成频谱图进行可视化的结果 上面的一个图片是音量…

内网渗透测试技巧与利用操作手册(SMB / MSSQL / LDAP)

SMB 枚举与利用清单 &#x1f50d; SMB 枚举与连接 # 尝试空会话连接&#xff08;Null Session&#xff09; smbclient -N -U "" -L \\<IP> smbclient -N -U "test" -L \\<IP> smbclient -N -U "Guest" -L \\<IP># 下载共享…

ADB(Android Debug Bridge)Android官方调试工具及常用命令

ADB的定义 ADB&#xff08;Android Debug Bridge&#xff09;是Android官方提供的调试工具&#xff0c;属于Android SDK的一部分。它通过命令行与Android设备通信&#xff0c;支持安装应用、调试、文件传输、日志抓取等功能&#xff0c;适用于开发、测试及高级用户场景。 ADB工…

再现重大BUG,微软紧急撤回Win 11六月更新

BUG年年有&#xff0c;今年特别多&#xff01; Windows 11发布这近4年来&#xff0c;咱们算是一路见证了其「要么在修复BUG&#xff0c;要么在修复BUG路上」这么一件壮举。 最新的6月Windows 11 24H2更新&#xff08;版本号KB5060842&#xff09;&#xff0c;微软带来了多项改…

ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?

提问 ROS2 工作空间中, CMakeLists.txt&#xff0c; setup.py和 package.xml的作用分别是&#xff1f; 回答 在一个 ROS 2 包&#xff08;package&#xff09;里&#xff0c;这三个文件各司其职&#xff1a; package.xml 作用&#xff1a;声明包的元信息和依赖关系&#xff…

Untiy打包安卓踩坑

Untiy 版本&#xff1a;unity6.1 运行环境&#xff1a;Win11 报错一&#xff1a; Assembly ‘Assets/ExternalDependencyManager/Editor/1.2.183/Google.IOSResolver.dll’ will not be loaded due to errors: 解决方法&#xff1a;通过在 Unity Hub 中下载 iOS 包来解决 报错…

2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)

大家好&#xff0c;我是你们的编程搬砖工~ 今天给大家安排一篇超级详细、超接地气、纯小白友好的《Python 安装教程 for Windows》&#xff0c;从下载到安装&#xff0c;从环境变量到验证&#xff0c;手把手带你装好 Python&#xff0c;不管你是 Python3.7、3.9、3.10 还是 3.1…