Go语言学习笔记(一)

一、Go语言简介

① Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。

② Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。

Go语言特色:

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数组安全、编译迅速

以下介绍部分Go语言在区块链中的应用

1.区块链领域:Go 是 "核心主力语言"

区块链技术的核心需求是高并发、分布式一致性、P2P 网络通信、稳定性、跨平台部署,而这些正是 Go 语言的 "强项":

·主流项目背书:全球顶级区块链项目(尤其是联盟链、公链基础设施)大量采用 Go 开发:

① 联盟链:Hyperledger Fabric(超级账本,企业级区块链首选,常用于溯源、供应链金融)、FISCO BCOS(国内主流联盟链,部分核心模块用 Go);

② 公链:Filecoin(分布式存储)、Cosmos(跨链生态)、Ethereum 2.0(部分组件如 Beacon Chain)、Polkadot(部分工具链);

·应用场景 :你可以用 Go 开发区块链的核心模块,比如:

① 联盟链节点、共识机制(PoS/PoW/RAFT)、P2P 网络通信;

② 区块链网关服务(对接智能合约、处理链上数据查询 / 写入);

③ 链上数据同步、备份、监控系统(比如实时抓取区块链上的溯源数据)。

·优势: Go 的 Goroutine 并发模型能轻松应对区块链节点的高并发请求(比如同时处理上千笔交易),编译后的二进制文件轻量、跨平台(可部署在云服务器、边缘设备),内置的net/httpsync等库简化分布式开发,开发效率远高于 C++,性能接近 Java。

2.智能合约领域:Go 是 "配套工具语言"

这里需要明确:智能合约的直接开发语言不是 Go,但 Go 是智能合约生态中 "不可或缺的配套工具语言":

① 主流智能合约开发语言:以太坊(Solidity)、波卡(Ink!,Rust)、Solana(Rust)、Hyperledger Fabric(Chaincode 支持 Go,但 Chaincode 更偏向 "链上应用" 而非公链智能合约)

② Go 的作用(核心价值):

**·**开发智能合约的 "链下辅助系统":比如批量部署合约、监听合约事件(如溯源系统中 "农产品入库" 的合约事件)、处理合约与外部系统的交互(比如将合约数据同步到智慧农业的数据库);

**·**开发合约测试工具、安全审计脚本(Go 的稳定性和强类型特性适合编写可靠的自动化工具);

**·**联盟链场景:Hyperledger Fabric 的 Chaincode 可以用 Go 编写(比如溯源系统中 "商品流转记录" 的链上逻辑),这是 Go 在合约层面的直接应用。

3.溯源系统领域:Go 是 "首选语言之一"

溯源系统(尤其是结合区块链的溯源)的核心需求是:分布式数据存储、不可篡改校验、跨节点数据同步、高可用 API 服务、对接物联网设备,这些都与 Go 的特性完美匹配:

应用场景:

① 后端 API 服务:用 Go 的 Gin/Echo 框架快速构建高并发的溯源接口(比如农产品种植数据上报、流通节点查询、区块链存证接口)

② 数据同步模块:将智慧农业的传感器数据(如温湿度、施肥记录)同步到区块链,Go 的并发能力可处理多设备同时上报;

③ 溯源数据校验:通过 Go 调用区块链节点 API,验证溯源数据的完整性(比如校验商品的哈希值是否与链上一致);

④ 边缘部署:溯源系统可能需要部署在农业基地的边缘网关(资源有限),Go 编译后的二进制文件体积小、内存占用低,适合边缘环境。

优势:对比 Java(笨重)、Python(性能不足),Go 在 "开发效率 + 性能 + 部署便捷性" 上平衡得最好,尤其适合需要快速迭代、跨环境部署的溯源系统。

4.智慧农业领域:Go 是 "高适配语言"

智慧农业的核心技术场景是 物联网设备接入、实时数据采集、边缘计算、云边协同、对接区块链 / 溯源系统,Go 的特性刚好贴合这些需求:

应用场景:

① 物联网设备通信:用 Go 的 MQTT 客户端库(如paho.mqtt.golang)对接传感器、无人机、灌溉设备,接收实时数据(如土壤湿度、光照时长);

② 边缘计算服务:在农业基地的边缘设备上部署 Go 服务,对采集到的数据进行预处理(过滤异常值、计算平均值),再同步到云端或区块链,减少网络带宽占用;

③ 远程控制服务:通过 Go 编写 API,实现对农业设备的远程控制(如自动灌溉、遮阳棚调节),Go 的高并发能力可支持多设备同时控制;

④ 数据联动:将智慧农业的数据与溯源系统、区块链无缝对接(比如将种植数据自动上报至溯源系统,再通过区块链存证),避免技术栈切换的成本。

优势:智慧农业常涉及 "多设备、多系统联动",Go 的跨平台特性(支持Windows/Linux/ARM 架构)、丰富的第三方库(物联网协议、数据库驱动、区块链 SDK)能大幅降低集成难度。

领域 适配度 核心作用 需补充的细分技术
区块链 9 分 开发节点、网关、共识模块 区块链原理、Hyperledger Fabric SDK
智能合约 6 分 配套工具、链下服务、联盟链 Chaincode Solidity(公链)、Chaincode(联盟链)
溯源系统 9.5 分 后端 API、数据同步、边缘部署 MQTT 协议、数据库(MySQL/MongoDB)
智慧农业 8.5 分 设备接入、边缘计算、云边协同 物联网协议、传感器数据处理

学习笔记部分

二、第一个Go程序

第一个 Go 程序 hello.go(Go 语言源文件的扩展是 .go),代码如下:

Go 复制代码
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

① 第一行代码 package main 定义了包名。(必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main)package main 表示一个可独立运行的程序,每个 Go 应用程序都包含一个名为 main 的包。

② 下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO (输入/输出)的函数。

③ 下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。

④ 下一行 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

⑤ 下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。

使用 fmt.Print("hello, world\n") 可以得到相同的结果。

Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。

⑥ 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

(Go 语言不提供 public/private 这类访问控制关键字,而是通过 标识符首字母的大小写 来决定其「可访问范围」:)

标识符首字母 访问权限 类比其他语言 适用场景
大写(A-Z) 导出(跨包可访问) public(公开) 需要被其他包调用的函数 / 变量 / 结构体等
小写(a-z) 包内可见(跨包不可访问) protected(保护) 仅当前包内部使用的辅助逻辑

❗️注意:需要注意的是 { 不能单独放在一行,所以以下代码在运行时会产生错误:

Go 复制代码
package main

import "fmt"

func main()  
{  // 错误,{ 不能在单独的行上
    fmt.Println("Hello, World!")
}

三、Go语言基础语法

1.Go标记

Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。如以下 GO 语句由 6 个标记组成:

Go 复制代码
fmt.Println("Hello, World!")

6 个标记是(每行一个):

Go 复制代码
1. fmt
2. .
3. Println
4. (
5. "Hello, World!"
6. )

2.行分割符

在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。

如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。

以下为两个语句:

Go 复制代码
fmt.Println("Hello, World!")
fmt.Println("Let's Go!")

3.注释

注释不会被编译,每一个包应该有相关注释。

单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。如:

Go 复制代码
// 单行注释
/*
 这里是
 多行注释
 */

4.标识符

标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。

以下是有效的标识符:

Go 复制代码
mahesh   kumar   abc   move_name   a_123
myname50   _temp   j   a23b9   retVal

5.字符串连接

Go 语言的字符串连接可以通过 + 实现:

Go 复制代码
package main
import "fmt"
func main() {
    fmt.Println("Google" + "Runoob")
}

以上实例输出结果为:

6.关键字

下面列举了 Go 代码中会使用到的 25 个关键字或保留字:

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

除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符:

|--------|---------|---------|---------|--------|---------|-----------|------------|---------|
| append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
| copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
| int32 | int64 | iota | len | make | new | nil | panic | uint64 |
| print | println | real | recover | string | true | uint | uint8 | uintptr |

·程序一般由关键字、常量、变量、运算符、类型和函数组成。

·程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}。

·程序中可能会使用到这些标点符号:.、,、;、: 和 ...。

7.Go语言的空格

在 Go 语言中,空格通常用于分隔标识符、关键字、运算符和表达式,以提高代码的可读性。

① Go 语言中变量的声明必须使用空格隔开,如:

Go 复制代码
var x int
const Pi float64 = 3.14159265358979323846

② 在运算符和操作数之间要使用空格能让程序更易阅读:

·无空格:

Go 复制代码
fruit=apples+oranges;

·在变量与运算符间加入空格,程序看起来更加美观,如:

Go 复制代码
fruit = apples + oranges; 

③ 在关键字和表达式之间要使用空格。

例如:

Go 复制代码
if x > 0 {
    // do something
}

④ 在函数调用时,函数名和左边等号之间要使用空格,参数之间也要使用空格。

例如:

Go 复制代码
result := add(2, 3)

8.格式化字符串

Go 语言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并赋值给新串:

· Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。

· Printf 根据格式化参数生成格式化的字符串并写入标准输出。

Go 复制代码
//Sprintf实例
package main

import (
    "fmt"
)

func main() {
   // %d 表示整型数字,%s 表示字符串
    var stockcode=123
    var enddate="2020-12-31"
    var url="Code=%d&endDate=%s"
    var target_url=fmt.Sprintf(url,stockcode,enddate)
    fmt.Println(target_url)
}

输出结果为:

Go 复制代码
//Printf实例
package main

import (
    "fmt"
)

func main() {
   // %d 表示整型数字,%s 表示字符串
    var stockcode=123
    var enddate="2020-12-31"
    var url="Code=%d&endDate=%s"
    fmt.Printf(url,stockcode,enddate)
}

更多内容链接:

Go fmt.Sprintf 格式化字符串 | 菜鸟教程

Go fmt.Printf 格式化字符串 | 菜鸟教程

相关推荐
小马爱打代码2 小时前
RabbitMQ:系统学习笔记
笔记·学习·rabbitmq
YJlio2 小时前
进程和诊断工具速查手册(8.13):VMMap / DebugView / LiveKd / Handle / ListDLLs 一页式现场排障清单
数据库·笔记·学习
alwaysuzybaiyy4 小时前
物联网控制|计算机控制-刘川来胡乃平版|第4章:过程通道与人机接口-4.4Human-Machine Interface|课堂笔记|
笔记·物联网·powerpoint
taxunjishu4 小时前
Modbus RTU 转 Modbus TCP:物联网网关实现中药产线巴赫曼与三菱PLC互联
人工智能·物联网·tcp/ip·区块链·工业自动化
弘毅 失败的 mian4 小时前
C++、Java 还是测试开发?
java·c++·经验分享·笔记·测试开发·技术方向·就业
AA陈超5 小时前
ASC学习笔记0019:返回给定游戏属性的当前值,如果未找到该属性则返回零。
c++·笔记·学习·游戏·ue5·虚幻引擎
Web3VentureView6 小时前
Synbo Protocol 受邀出席ETHShanghai 2025,以共识机制重构链上融资生态
金融·web3·去中心化·区块链
星星20259 小时前
VSCode插件精选:4款高效UML绘图工具
笔记
lkbhua莱克瓦2413 小时前
Java基础——方法
java·开发语言·笔记·github·学习方法