首页 > 其他分享 >Go基本语法

Go基本语法

时间:2024-09-28 17:36:14浏览次数:1  
标签:基本 fmt goroutine sync C++ 语法 Println Go

解释文档 1: Go 基础语法与变量声明

package main

import (
	"fmt"
	"sync"
	"time"
)
  • package main:每个 Go 程序必须有一个 main 包,包含 main 函数作为程序的入口。
  • import:导入标准库中的包,如 fmtsynctime,用于格式化输出、同步机制以及时间处理。

Go 与 C++ 对比:

  • Go 中不需要显式包含头文件,而是通过 import 直接导入包。在 C++ 中,头文件需要手动包含。
// 变量初始化的多种方式
var a int = 10         // 显式声明并初始化
b := 20                // 简短声明
var c float64          // 声明未初始化,默认值为零值
c = 30.5               // 后续赋值
var d, e = "Hello", 42 // 多变量同时初始化
const pi = 3.14        // 常量声明
fmt.Println(a, b, c, d, e, pi)
  • var:=:Go 支持两种变量声明方式,var 显式声明,:= 简短声明。
  • 零值:未初始化的变量有默认值(如 int0float640.0)。
  • const:Go 中常量使用 const 声明。
  • fmt.Println:标准输出函数。

Go 与 C++ 对比:

  • Go 自动为未初始化的变量赋予零值,C++ 中未初始化的变量则是未定义行为。
  • Go 的简短声明 := 让代码更简洁,而 C++ 需要显式声明变量类型。

解释文档 2: 数组、切片和控制语句

// 数组和切片初始化
arr := [3]int{1, 2, 3}        // 数组,大小固定
slice := []string{"Go", "Python", "Java"} // 切片,大小可变
fmt.Println(arr, slice)
  • arr 是一个数组,大小固定。
  • slice 是 Go 的切片,类似于动态数组,大小可变且更灵活。

Go 与 C++ 对比:

  • Go 提供了切片(slice),用于动态管理内存;C++ 使用 std::vector 达到类似效果。
// 判断语句
if a > b {
	fmt.Println("a is greater than b")
} else {
	fmt.Println("b is greater than or equal to a")
}

// switch 语句
switch e {
case 40:
	fmt.Println("e is 40")
case 42:
	fmt.Println("e is 42")
default:
	fmt.Println("e is neither 40 nor 42")
}
  • ifswitch:Go 的控制语句和 C++ 类似,不过 Go 的 switch 不需要 break,每个 case 自动终止。

Go 与 C++ 对比:

  • Go 中 switch 不需要 break,简化了代码结构,而 C++ 需要显式使用 break
// for 循环
for i := 0; i < 3; i++ {
	fmt.Printf("Loop iteration: %d\n", i)
}

// for-range 循环
for index, value := range slice {
	fmt.Printf("Index: %d, Value: %s\n", index, value)
}
  • for 是 Go 唯一的循环结构,既能像 C++ 的 for 一样循环,也能像 for-each 遍历集合。

Go 与 C++ 对比:

  • Go 只有 for 一种循环结构,而 C++ 还有 whiledo-while

解释文档 3: 结构体、接口与并发

// 定义接口
type Animal interface {
	Speak() string
}

// 定义结构体并实现接口
type Dog struct {
	Name string
	Age  int
}

func (d Dog) Speak() string {
	return "Woof!"
}

// 初始化结构体的另一种方式
type Cat struct {
	Name string
}

func (c Cat) Speak() string {
	return "Meow!"
}
  • interface:Go 中的接口定义了一组方法,任何实现这些方法的类型都自动实现了该接口。
  • struct:Go 中的结构体类似 C++ 中的类,但没有构造函数和继承,通过接口实现多态。

Go 与 C++ 对比:

  • Go 使用接口实现多态,而 C++ 使用虚函数和继承。
  • Go 没有类的概念,所有的封装通过结构体实现,C++ 则通过类(class)实现更复杂的面向对象编程。
// Goroutine 和 Channel
ch := make(chan int)

// 启动一个goroutine
go func() {
	fmt.Println("Goroutine: Sending value to channel")
	ch <- 100 // 向通道发送值
}()

// 在主 goroutine 中接收值
value := <-ch
fmt.Printf("Main Goroutine: Received value from channel: %d\n", value)
  • goroutine:Go 的轻量级线程,通过 go 关键字启动。
  • channel:Go 的并发原语,用于在 goroutine 之间通信。

Go 与 C++ 对比:

  • Go 中的并发模型基于 CSP(通信顺序进程),通过 goroutine 和 channel 实现。C++ 则主要依赖于线程和锁机制来实现并发。

解释文档 4: 条件变量与同步机制

// 条件变量和等待机制
var wg sync.WaitGroup
var cond = sync.NewCond(&sync.Mutex{})
var sharedData = false

// 生产者函数
func producer() {
	defer wg.Done()
	time.Sleep(time.Second) // 模拟生产延迟
	cond.L.Lock()
	sharedData = true
	fmt.Println("Producer: Data produced")
	cond.Signal() // 通知等待中的消费者
	cond.L.Unlock()
}

// 消费者函数
func consumer() {
	defer wg.Done()
	cond.L.Lock()
	for !sharedData {
		fmt.Println("Consumer: Waiting for data")
		cond.Wait() // 等待生产者的通知
	}
	fmt.Println("Consumer: Data consumed")
	cond.L.Unlock()
}

func main() {
	// 启动生产者和消费者
	wg.Add(2)
	go producer()
	go consumer()

	// 等待所有 goroutine 完成
	wg.Wait()
	fmt.Println("Program finished.")
}
  • sync.WaitGroup:用于等待一组 goroutine 完成。
  • sync.Cond:条件变量,用于协调多个 goroutine 之间的同步操作。
  • producerconsumer:模拟了经典的生产者-消费者模式,通过条件变量和锁来协调同步。

Go 与 C++ 对比:

  • Go 的 sync.Cond 类似于 C++ 的条件变量(std::condition_variable),但 Go 的 goroutine 更轻量化,容易实现大规模并发。
  • WaitGroup 提供了简单的等待 goroutine 完成的机制,而 C++ 通常使用 std::threadstd::future 等配合使用。

标签:基本,fmt,goroutine,sync,C++,语法,Println,Go
From: https://www.cnblogs.com/929code/p/18438181

相关文章

  • golang shell
    packageshellimport( "context" "fmt" "os/exec" "time")//自定义输出结构体typecustomOutputstruct{ outPutchanstring resetCtxchanstruct{}}//Write将输出写入到customOutput结构体中,并通知重置超时。func(ccustomOutput......
  • Redis 五大基本数据类型及其应用场景进阶(缓存预热、雪崩 、穿透 、击穿)
    Redis数据类型及其应用场景Redis是什么?Redis是一个使用C语言编写的高性能的基于内存的非关系型数据库,基于Key/Value结构存储数据,通常用来缓解高并发场景下对某一资源的频繁请求,减轻数据库的压力。它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等。Redis......
  • Redis入门-五大基本数据类型
    启动我的redis(我的redis是在www下面的server下面的redis下面的src里面去执行下面这串指令,如果你的src在其他地方可以换)./redis-server&cd到src下面对redis进行压力测试宝塔用不了(因为没有这个对应的文件)redis-benchmark-hlocalhost-p6379-c100-n100000常用命令......
  • 英文论文基本结构
    IntroductionIntroduction一般是最后写,作为全文的一个缩影(索引)。一般是简要介绍大背景,然后介绍一些重要的相关工作,指出其不足,然后引出我们的工作,介绍我们的工作的主要贡献。最后一般还会介绍一下全文结构,哪节讲了什么,方便读者针对性阅读。Background详细介绍相关工作。可以指......
  • python基于Django音乐交流分享平台的设计-音乐播放网站(源码+vue+部署文档+讲解等)
    收藏关注不迷路!!......
  • 第一章数据管理【4’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)
    1、以下哪个不是DAMA-DMBOK的数据管理框架图?(知识点:第一章数据管理)A.DAMA车轮图B.DMBOK金字塔图C.环境因素六边形图D.知识领域语境关系图参考答案:B题目解析:DMBOK2第一章数据管理1.3.3,DAMA-DMBOK框架2、以下关于数据管理原则描述正确的是?(知识点:第一章数据管理)A.......
  • 第二章数据伦理处理【2’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点
    1、数据伦理处理在业务驱动中有供给者、参与者、消费者三方共同构成,以下哪个成员不属于消费者一方?(知识点:第二章数据伦理处理)A.员工B.管理人员C.监管部门D.变更经理参考答案:D题目解析:P29.数据伦理处理语境关系图2、在数据处理伦理的活动中,下列哪项不属于活动之一?(知......
  • 第三章数据治理【10’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)
    1、数据治理的驱动因素大多聚焦于减少风险或者改进流程,以下关于改进流程的描述中哪项不正确:(知识点:第三章数据治理)A.有效和持续地响应监管要求B.通过数据的完整一致性提升业务绩效C.定义和定位组织中的数据,确保元数据被管理和应用D.利用数据全周期治理来管理特定数据的......
  • Go五种字符串的拼接
    +funcmain(){s1:="hello"s2:="word"s3:=s1+s2fmt.Print(s3)//s3="helloword"}sprintfs1:="hello"s2:="word"s3:=fmt.Sprintf("%s%s",s1,s2)//s3="hell......
  • 在 Go 语言中使用 Redis 实现事务并保证 ACID 属性及理解隔离级别
    目录一、Redis事务的基本概念二、在Go语言中使用Redis实现事务的步骤(一)安装Redis客户端库(二)创建Redis客户端(三)开启事务(四)执行事务命令(五)提交事务三、保证事务的ACID属性(一)原子性(Atomicity)(二)一致性(Consistency)(三)隔离性(Isolation)(四)持久性(Durability)四、......