Golang快速鸟瞰

news2024/11/20 4:51:51

文章目录

    • 引子
    • 知识图谱
    • 代理设置
    • 关键字
    • 数据类型
    • 变量
    • struct 和 interface
    • 控制语句
    • 字符串
    • 单引号、双引号、反引号
    • 数组与切片
    • 字典
    • make和new
    • json与yaml
    • 基本语法
    • 指针
    • Channel
    • defer
    • init函数
    • error, panic, recover
    • channel与协程
    • 调试
    • 热加载
      • Gin的热加载
      • Iris的热加载
    • 常用Golang框架
    • 常用链接
    • 开源项目

引子

玩腻了Python和Java的同学,可以试试Golang,换个口味。其实Golang已经流行好几年了,我们项目中2016年就在使用Golang了。但我一直没有时间去尝试,最近入手了一下,果然是香。

我最初看中它的是部署方便,代码保密性高于Java。目前看来,大部分后端程序都是可以用Golang开发的。

Golang适用场景:

  • 网络编程:构建高性能的网络应用程序,如web服务器、API服务器
  • 并发编程:如消息队列、爬虫
  • 分布式系统:如etcd、Consul、ZooKeeper,支持RPC和序列化机制
  • 云计算:构建以docker和k8s为基础设施的云原生应用
  • 区块链:其实是一大应用,如Ethereum的Go语言客户端Geth
  • 数据库编程和系统编程:不弱于C/C++,编写底层工具,得益于Go和C的无缝衔接

总而言之,后端网络和分布式编程是Golang的主战场,主打高性能、高并发和云原生

知识图谱

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Golang都是按包名调用,和文件名无关。通常包名和所在的目录名称相同。

import (
	. "fmt" // 调用时可以去掉包名
	_ "go-common/app/infra/notify/conf" // _操作只是为了简单的调用包里的init函数(),不能引用其它函数
	xsql "go-common/library/database/sql" // 别名,防止冲突
)

包名为main,且其中包含main()函数的文件能编译成可执行文件,该文件未必一定要放在main目录下。

代理设置

goproxy
https://goproxy.io/zh/

七牛云
https://goproxy.cn

阿里云
https://mirrors.aliyun.com/goproxy/

$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
$ go env -u GOPROXY //取消代理

关键字

Golang一共25个关键字:

break、case、chan、const、continue、default、defer、else、fallthrough、for
func、go、goto、if、import、interface、map、package、range、return
select、struct、switch、type、var

此外,rune 和 byte 是Go 语言中仅有的两个类型别名。
它的定义:

 type rune = int32
 type byte = uint8

rune相当于Java里的char类型。

数据类型

• 布尔类型:bool
• 整型:int8、byte、int16、int、uint、uintptr 等
• 浮点类型:float32、float64
• 复数类型:complex64、complex128
• 字符串:string
• 字符类型:rune,本质上是 uint32
• 错误类型:error

此外,Go 语言也支持以下这些复合类型:
• 指针(pointer)
• 数组(array)
• 切片(slice)
• 字典(map)
• 通道(chan)
• 结构体(struct)
• 接口(interface)

变量

new(T): 根据类型T分配内存;设置内存为0;返回内存的指针
make只用于初始化 slice,map 和 channel
makeSlice := make([]int, 5, 10)

struct 和 interface

空结构体struct{}一般用作占位符
空接口interface{}代表任意类型

控制语句

  • if 语句的判断条件都没有了括号包起来,还可以前置写变量初始化语句,类似于 for 循环
  • 左花括号{必须与 if 或者 else 处于同一行

字符串

//字符相关的转化一般用 strconv 包
v1 := “100”
v2, err := strconv.Atoi(v1) // 将字符串转化为整型,v2 = 100
v3 := 100
v4 := strconv.Itoa(v3) // 将整型转化为字符串, v4 = “100”

避免[]byte和string的反复来回转换

单引号、双引号、反引号

  • 单引号在 Golang 表示一个字符,使用一个特殊类型 rune 表示字符型。rune 为 int32 的别名,它完全等价于 int32,习惯上用它来区别字符值和整数值。rune 表示字符的 Unicode 码值
  • 双引号用来创建可解析的字符串字面量,支持转义,但不能用来引用多行。
  • 反引号用来创建原生的字符串字面量 ,这些字符串可能由多行组成,不支持任何转义序列。原生的字符串字面量多用于书写多行消息、HTML 以及正则表达式。

数组与切片

//定义数组
var a [8]byte // 长度为 8 的数组,每个元素为一个字节 var b [3][3]int // 二维数组(9 宫格)
var c [3][3][3]float64 // 三维数组(立体的 9 宫格)
var d = [3]int{1, 2, 3} // 声明时初始化
var e = new([3]string) // 通过 new 初始化
var f = make([]string, 3) // 通过 make 初始化
//初始化
a := [5]int{1,2,3,4,5} b := […]int{1, 2, 3}
//切片
b := []int{} //数组切片 slice 就是一个可变长数组
c := a[1:3] // 有点类似于 subString,或者 js.slice
d := make([]int, 5) //make 相当于,new、alloc,用来分配内存

遍历删除数组:

var next *Element
for e := l.Front(); e != nil; e = next {
	next = e.Next()
	l.Remove(e)
}

字典

var testMap map[string]int testMap = map[string]int{
"one": 1, "two": 2, "three": 3,
}
//还可以这样初始化:
var testMap = make(map[string]int) //map[string]int{} testMap["one"] = 1
testMap["two"] = 2
testMap["three"] = 3

如果map的value较大,通常应该使用指针来存储,以避免性能问题,类似的还有channel,slice等。

make和new

  • new()返回的永远是类型的指针,指针指向分配类型的内存地址;
  • make()返回值
  • new 可以分配任意类型的数据
  • slice、chan、map 只能用 make,本身就是指针。其他 make、new 都行
func new(Type) *Type

// 切片
make([]T, length, capacity)

json与yaml

基本语法

  • 根据其首字母大小写来决定,如果属性名或方法名首字母大写

指针

指针在 Go 语言中有两个使用场景: 类型指针和数组切片
Go 语言中的类型指针不能进行偏移和运算。
不同于C/C++,Go中可以返回局部变量的指针,因为Go编译器会对每个局部变量进行逃逸分析,会将这样的变量分配在堆上。

Channel

channel类似于消息队列,用于生产者和消费者间的通信,并适配两者的速度。

done := make(chan Result, 1) 
go func() {
	done <- Result{}
}()
result := <-done fmt.Println(result)

并行编程中,多个 goroutine 间采用生产者/消费者模型通信时,就用到channel。

defer

defer 流程有点像 Java 里面的 finally,保证了一定能执行,我感觉底层也是 goto 的 实现吧。在后面跟一个函数的调用,就能实现将这个 xxx 函数的调用延迟到当前函 数执行完后再执行。

常用来做资源清理、关闭文件、解锁、记录执行时间。
禁止函数退出的几种方法:

func main() {
    defer func() { for {} }()
}

func main() {
    defer func() { select {} }()
}

func main() {
    defer func() { <-make(chan bool) }()
}

init函数

主要作用:

  • 初始化不能采用初始化表达式初始化的变量。
  • 程序运行前的注册。
  • 实现sync.Once功能。
  • 其他

init函数的主要特点:

  • init函数先于main函数自动执行,不能被其他函数调用;
  • init函数没有输入参数、返回值;
  • 每个包可以有多个init函数;
  • 包的每个源文件也可以有多个init函数,这点比较特殊;
  • 同一个包的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
  • 不同包的init函数按照包导入的依赖关系决定执行顺序。

没有 class 这个关键字,Go 里面的类是用结构体来定义的:

type Student struct { 
	id uint
	name string 
	male bool 
	score float64
}

//没有构造函数,但是可以用函数来创建实例对象,并且可以指定字段初始化,类似于 Java 里面的静态工厂方法

func NewStudent(id uint, name string, male bool, score float64) *Student {
	return &Student{id, name, male, score} }

func NewStudent2(id uint, name string, male bool, score float64) Student { 
	return Student{id, name, male, score}
}

error, panic, recover

channel与协程

channel可以理解为消息队列,通信操作符 <- 的箭头指示数据流向。

  • 向 channel 中添加数据(channel<-data);
  • 从 channel 中读取数据(data<-channel);
  • data<-channel, 从 channel 中接收数据并赋值给 data
  • <-channel,从 channel 中接收数据并丢弃
  • 关闭 channel(通过 close()函数实现)

channel 分为有缓冲 channel 和无缓冲 channel,无缓冲 channel 在读和写的过程中是都会阻塞。

var ch = make(chan int) // 无缓冲
var ch = make(chan int,10)  // 有缓冲,实际上是一个阻塞队列,长度为0, 容量为10
func longTask(signal chan int) {
  // 不带参数的 for
  // 相当于 while 循环
  for {
    // 接收 signal 通道传值
    v := <- signal
 
    // 如果接收值为 1,停止循环
    if v == 1 {
      break
    }
 
    time.Sleep(1 * Second)
  }
}
 
func main() {
  // 声明通道
  sig := make(chan int)
 
  // 异步调用 longTask
  go longTask(sig)
 
  // 等待 1 秒钟
  time.Sleep(1 * time.Second)
 
  // 向通道 sig 传值
  sig <- 1
 
  // 然后 longTask 会接收 sig 传值,终止循环
}

调试

  • 安装delve:

go install github.com/go-delve/delve/cmd/dlv

  • 然后在vscode中配置launch.json:
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [       
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${file}"
        }
    ]
}
  • 打开要调试的文件,如main.go,然后F5即可启动调试

热加载

Gin的热加载

安装fresh: github.com/pilu/fresh

Iris的热加载

安装rizla:

go install github.com/kataras/rizla@latest

然后命令行执行:

rizla main.go

常用Golang框架

  • Gin : web 框架
  • Echo : High performance, minimalist Go web framework
  • fresh : About Build and (re)start go web apps after saving/creating/deleting source files

常用链接

  • Go的官方文档
  • Go的中文api文档
  • Go中文社区网站
  • 地鼠文档
  • uber Go编码规范
  • Go高性能编程

开源项目

  • 开源内容管理系统ponzu
  • 开源内容管理:perkeep
  • buttercms
  • 开源社区系统bbs-go
  • 一个基于 Beego 开发的可切换模板的 BBS 社交博客系统

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

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

相关文章

数据库基础作业(linux系统)

数据库作业 在linux系统下的MySQL 创建数据库 使用数据库 查询当前默认的数据库以及使用的编码方式校验规则 查询创建数据的语句 删除数据库 创建数据表 定义多个字段,用上所有数据类型 mysql> SHOW CREATE TABLE multi_tb; -----------------------------------------…

重新理解z-index

一&#xff0c;前言 今天遇到一个布局兼容问题&#xff0c;调试了一番&#xff0c;发现z-index的表现和自己的认知不相符&#xff0c;才知道自己对z-index的认知有错误&#xff0c;于是写篇文章总结下这个z-index的具体使用。有基础的朋友可以直接看第四节。 二&#xff0c;标…

Android 内存治理之线程

1、 前言 当我们在应用程序中启动一个线程的时候&#xff0c;也是有可能发生OOM错误的。当我们看到以下log的时候&#xff0c;就说明系统分配线程栈失败了。 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory这种情况可能是两种原因导致的。…

行业追踪,2023-07-06,市场反馈平平

自动复盘 2023-07-06 成交额超过 100 亿 排名靠前&#xff0c;macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类&#xff0c;这样更能体现主流方向 rps 有时候比较滞后&#xff0c;但不少是欲杨先抑&#xff0c; 应该持续跟踪&#xff0c;等 macd 反转时参与…

rust 从转移说起

Rust 专门提出了所有权和转移的概念&#xff0c;第一次接触总感觉晦涩&#xff0c;不属于正常思维&#xff0c;但还是得耐下性子&#xff0c;观摩观摩 Rust 所谓的转移。 Rust 中&#xff0c;对大多数类型而言&#xff0c;给变量赋值、给函数传值或者从函数返回值&#xff0c;…

Eclipse显示层级目录结构(像IDEA一样)

有的小伙伴使用IDEA习惯了&#xff0c;可能进入公司里面要求使用eclipse&#xff0c;但是eclipse默认目录是并列显示&#xff0c;而不是层级显示。部分人用起来感觉十分不方便。我们可以更改一下设置。 1、打开eclipse&#xff0c;找到这里 2、选择PackagePresentation 3、选…

支持跨语言、人声狗吠互换,仅利用最近邻的简单语音转换模型有多神奇

AI 语音转换真的越复杂越好吗&#xff1f;本文就提出了一个方法简单但同样强大的语言转换模型&#xff0c;与基线方法相比自然度和清晰度毫不逊色&#xff0c;相似度更是大大提升。 AI 参与的语音世界真神奇&#xff0c;既可以将一个人的语音换成任何其他人的语音&#xff0c;…

express框架中间件

1.介绍 说明&#xff1a;Express框架中间件是指在处理HTTP请求前或后对请求和响应进行处理的函数。具体而言&#xff0c;中间件可以&#xff1a; 执行一些公共的逻辑&#xff0c;比如身份验证、日志记录、错误处理等。修改请求和响应&#xff0c;比如缓存、压缩等。控制请求流…

ModaHub魔搭社区:基于 Amazon EKS 搭建开源向量数据库 Milvus

目录 01 前言 02 架构说明 03 先决条件 04 创建 EKS 集群 05 部署 Milvus 数据库 06 优化 Milvus 配置 07 测试 Milvus 集群 08 总结 01 前言 生成式 AI&#xff08;Generative AI&#xff09;的火爆引发了广泛的关注&#xff0c;也彻底点燃了向量数据库&…

Ubuntu中删除LibreOffice方法

目录 删除LibreOffice套件 删除所有与LibreOffice相关的软件包 删除与LibreOffice相关的配置文件 删除LibreOffice套件 1、打开终端。您可以使用快捷键Ctrl Alt T来打开终端。 2、输入以下命令以卸载LibreOffice套件&#xff1a; sudo apt-get remove libreoffice* 删…

[管理与领导-7]:新任管理第1课:管理转身--从技术业务走向管理 - 管理常识1

目录 第1章 管理基本概念 1.1 什么是管理&#xff1f; 1.2 管理的要素与职能 第2章 管理是什么&#xff1f; 2.1 以终为始 2.2 资源的优化配置 2.3 分而治之&#xff1a;分目标、分任务、分权力、分利益 2.4 目标明确 2.5 优先级 2.6 知人善用&#xff0c;人尽其才 …

【零基础入门学习Python---Python与其他技术的整合之快速入门实践】

&#x1f680; 零基础入门学习Python&#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜…

2023和鲸夏令营创作活动【黄金价格分析预测】

2023和鲸夏令营创作活动【黄金价格分析预测】 文章目录 2023和鲸夏令营创作活动【黄金价格分析预测】一、项目背景二、数据说明三、数据预处理四、数据探索性分析五、构建LSTM模型预测1、构建LSTM模型2、绘制loss的变化曲线3、进行预测 一、项目背景 本项目的目标是分析并预测…

SpringBoot——在测试阶段验证Web表现层的接口是否正常

验证请求状态 之前我们实现了在测试环境中开启Web环境&#xff0c;并且在测试阶段发送虚拟请求&#xff0c;并看到了返回的结果&#xff0c;这次我们不止要看他的请求结果&#xff0c;还要看他的请求过程和请求状态 匹配请求状态 首先就是查看请求的状态。主要介绍的就是一个…

基于 Arduino 库实现 ESP32 使能 WiFi AP + TCP Server 的应用

实现步骤&#xff1a; ESP32 开启 WiFi AP 模式创建 WiFi 热点定义 IP 地址创建 TCP Server 测试代码如下&#xff1a; #include <WiFi.h> #include <WiFiClient.h>const char* ssid "cc123"; const char* password "espressif";WiFiServ…

Python-年会抽奖

#!/usr/bin/python # coding:utf-8 # Author:Rauckimport randomclass WhoIsLuck:"""年会抽奖"""# 奖品gift [{name: 一等奖, limit: 3, desc: 泰国5日游手术费报销},{name: 二等奖, limit: 6, desc: iPhone14手机},{name: 三等奖, limit: 30, …

【Linux OS】华为openEuler操作系统与openGauss数据库安装及使用入门

华为openEuler操作系统与openGauss数据库安装及使用入门 1、软件下载1.1、openEuler1.2、openGauss1.3、Data Studio 2、系统安装2.1、创建虚拟机2.2、安装操作系统2.3、登录系统 3、数据库安装及设置3.1、数据库安装3.2、数据库管理3.3、数据库设置 4、数据库访问4.1、Navicat…

Redis:IO多路复用深度解析

目录 一、Multiplexing&#xff08;IO多路复用&#xff09;1.是什么2.能干嘛3.Reactor设计模式4.select, poll, epoll 都是I/O多路复用的具体的实现4.1 select方法4.2 poll方法4.3 epoll方法4.4 三个方法对比 5.5种 I/O 模型总结6.为什么3个都保有 一、Multiplexing&#xff08…

关于如何使用 python 下载 json 格式数据

本章节内容节自《python编程从入门到实践》第十六章&#xff0c;我们将从网络上下载数据&#xff0c;并对数据进行可视化。就可以对其进行分析甚至观察其规律和关联。 学习目标 我们将访问并可视化以下两种常见格式存储的数据&#xff1a; CSV 使用 Python 模块 CSV 来处理以 C…

SpringBoot整合EasyExcel 3.x

文章目录 1 EasyExcel 3.x1.1 简介1.2 引入依赖1.3 简单导出1.3.1 定义实体类1.3.2 自定义转换器1.3.3 定义接口 1.4 简单导入1.5 复杂导出1.5.1 引言1.5.2 自定义注解1.5.3 定义实体类1.5.4 数据映射与平铺1.5.5 自定义单元格合并策略1.5.6 定义接口 1 EasyExcel 3.x 1.1 简介…