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 分配套工具、链下服务、联盟链 ChaincodeSolidity(公链)、Chaincode(联盟链)
溯源系统9.5 分后端 API、数据同步、边缘部署MQTT 协议、数据库(MySQL/MongoDB)
智慧农业8.5 分设备接入、边缘计算、云边协同物联网协议、传感器数据处理

学习笔记部分

二、第一个Go程序

第一个 Go 程序 hello.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(保护)仅当前包内部使用的辅助逻辑

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

package main

import "fmt"

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

三、Go语言基础语法

1.Go标记

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

fmt.Println("Hello, World!")

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

1. fmt
2. .
3. Println
4. (
5. "Hello, World!"
6. )

2.行分割符

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

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

        以下为两个语句:

fmt.Println("Hello, World!")
fmt.Println("Let‘s Go!")

3.注释

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

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

// 单行注释
/*
 这里是
 多行注释
 */

4.标识符

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

        以下是有效的标识符:

mahesh   kumar   abc   move_name   a_123
myname50   _temp   j   a23b9   retVal

5.字符串连接

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

package main
import "fmt"
func main() {
    fmt.Println("Google" + "Runoob")
}

以上实例输出结果为:

6.关键字

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

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

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

appendboolbytecapclosecomplexcomplex64complex128uint16
copyfalsefloat32float64imagintint8int16uint32
int32int64iotalenmakenewnilpanicuint64
printprintlnrealrecoverstringtrueuintuint8uintptr

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

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

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

7.Go语言的空格

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

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

var x int
const Pi float64 = 3.14159265358979323846

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

        ·无空格:

fruit=apples+oranges;

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

fruit = apples + oranges; 

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

        例如:

if x > 0 {
    // do something
}

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

        例如:

result := add(2, 3)

8.格式化字符串

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

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

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

//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)
}

输出结果为:

//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 格式化字符串 | 菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值