湖州网站设计平台,怎样给公司申请一个网站,wordpress能恢复修改前吗,做网站的有什么软件备注#xff1a;本博客将自己初步学习GO的总结进行分享#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力#xff0c;如有错误请留言指正#xff0c;谢谢#xff01;
一、初步了解Go语言
#xff08;一#xff09;Go语言诞生的主要问题和目标…
备注本博客将自己初步学习GO的总结进行分享希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力如有错误请留言指正谢谢
一、初步了解Go语言
一Go语言诞生的主要问题和目标 多核硬件架构 随着计算机硬件的发展多核处理器成为主流使得并行计算变得普遍。然而传统的编程语言在处理多核并行性时可能面临困难因为它们缺乏合适的原生支持。Go语言通过引入轻量级的协程goroutine和通道channel机制使得并发编程变得更加容易。开发者可以轻松地创建数千个并发执行的协程而无需担心线程管理的复杂性。 超大规模分布式计算集群 随着云计算和分布式系统的崛起构建和维护超大规模的分布式计算集群变得越来越常见。这些集群需要能够高效处理大量的请求、数据共享和协调。Go语言的并发特性和通道机制使得编写分布式系统变得更加容易开发者可以使用协程和通道来处理并发任务、消息传递和协调工作。 Web模式导致的开发规模和更新速度增加 Web应用的兴起带来了前所未有的开发规模和持续更新的需求。传统的编程语言在开发大型Web应用时可能会面临可维护性、性能和开发效率等问题。Go语言通过其简洁的语法、高效的编译速度以及并发支持使得开发者能够更快速地迭代和部署Web应用同时也能够更好地处理高并发的网络请求。
综合来看Go语言在诞生时确实着重解决了多核硬件架构、超大规模分布式计算集群和Web模式下的开发规模与速度等技术挑战。它的设计目标之一是提供一种适应现代软件开发需求的编程语言使开发者能够更好地应对这些挑战。
二Go语言应用典型代表
Go语言在当下应用开发中已经得到广泛应用许多知名公司和项目都使用Go语言来构建各种类型的应用。以下是一些代表性的产品和项目它们使用了Go语言作为核心开发语言 这些仅仅是Go语言应用的一小部分示例实际上还有许多其他的项目和产品也在使用Go语言来构建高性能、可靠且易于维护的应用程序。这表明Go语言在现代应用开发中发挥了重要作用特别是在分布式系统、云计算和高性能应用领域。
三Java、C、C程序员在学习编写Go时存在的误区
当Java、C、C等编程语言的程序员开始学习编写Go语言时可能会遇到一些误区因为Go在某些方面与这些传统语言有所不同。以下是一些常见的误区 过度使用传统的并发模型 传统的编程语言如Java、C、C在处理并发时通常使用线程和锁来实现但在Go中使用协程goroutine和通道channel是更好的方式。新学习Go的程序员可能会继续使用传统的并发模型而不充分利用Go的轻量级协程和通道从而失去了Go的并发优势。 过度使用指针 C和C等语言强调指针的使用但Go语言在设计时避免了过多的指针操作。新学习Go的程序员可能会过度使用指针导致代码变得复杂。在Go中尽量避免使用指针除非真正需要对值进行修改。 忽视错误处理 Go鼓励显式地处理错误而不是简单地忽略它们。这与一些其他语言的习惯不同其中错误往往被忽略或简单地抛出。新学习Go的程序员可能会忽视错误处理导致潜在的问题未被检测到。 过度使用全局变量 在C和C等语言中全局变量可能是常见的做法。然而在Go中全局变量的使用被视为不良实践。Go鼓励使用局部变量和传递参数的方式来传递数据以避免引入不必要的耦合和副作用。 不熟悉切片和映射 Go中的切片和映射是强大的数据结构但对于其他语言的程序员来说可能不太熟悉。学习如何正确使用切片和映射是很重要的因为它们在Go中广泛用于集合和数据处理。 错误的Go风格 每种语言都有其独特的编码风格和惯例。新学习Go的程序员可能会在Go代码中应用其他语言的编码风格这可能会使代码难以阅读和理解。了解和遵循Go的编码规范是很重要的。
为了避免这些误区学习Go的程序员应该投入时间去理解Go语言的核心概念包括并发模型、错误处理、数据结构等同时积极参与Go社区阅读Go的官方文档和示例代码以便更好地适应Go的设计理念和最佳实践。
二、环境准备以Mac说明
一环境设置
在macOS上设置Go语言开发环境非常简单您可以按照以下步骤进行操作 使用Homebrew安装 如果您使用Homebrew包管理器这是最方便的方法。打开终端并运行以下命令来安装Go语言 brew install go 手动安装 如果您希望手动安装Go语言可以按照以下步骤操作 a. 访问官方网站下载安装包goX.X.X.darwin-amd64.pkg b. 双击下载的安装包按照指示运行安装程序。按照默认设置即可安装路径通常是/usr/local/go。 设置环境变量 一旦安装完成您需要将Go语言的二进制路径添加到您的终端配置文件中的PATH环境变量中。这样您就可以在终端中直接运行Go命令。 a. 打开终端并使用文本编辑器如nano、vim或任何您喜欢的编辑器编辑您的终端配置文件。例如 nano ~/.bash_profile b. 在文件中添加以下行根据您的安装路径进行调整然后保存并退出编辑器 export PATH$PATH:/usr/local/go/bin c. 使配置生效可以运行以下命令或者重启终端 source ~/.bash_profile 验证安装 打开终端输入以下命令来验证Go是否已正确安装 go version 如果您看到了Go的版本号表示安装成功。
二IDE选择说明
我个人使用的GoLand直接官网下载后上网购买破解版即可这里不在多说
三、Go语言程序学习
创建自己的工程目录/Users/zyf/zyfcodes/go/go-learning新建src目录。
一第一个Go语言编写
src目录下创建chapter1/hello目录新建hello.go文件编写代码如下
package mainimport (fmtos
)/*** author zhangyanfeng* description 第一个godaima* date 2023/8/20 23:45* param* return**/
func main() {if len(os.Args) 1 {fmt.Println(Hello World, os.Args[1])}
}这段代码是一个简单的Go语言程序它接受命令行参数并打印出一条带参数的 Hello World 消息。下面是对代码的逐行分析 package main: 声明这个文件属于名为 main 的包这是一个Go程序的入口包名。 import (fmt os): 引入了两个标准库包分别是 fmt 用于格式化输出和 os 用于与操作系统交互。 func main() { ... }: 这是程序的入口函数它会在程序运行时首先被调用。 if len(os.Args) 1 { ... }: 这个条件语句检查命令行参数的数量是否大于1也就是判断是否有参数传递给程序。os.Args 是一个字符串切片它包含了所有的命令行参数第一个参数是程序的名称。 fmt.Println(Hello World, os.Args[1]): 如果有参数传递给程序就会执行这行代码。它使用 fmt.Println 函数打印一条消息消息由字符串 Hello World 和 os.Args[1] 组成os.Args[1] 表示传递给程序的第一个参数。
综上所述这段代码涵盖了以下知识点 包导入和使用标准库通过 import 关键字导入 fmt 和 os 包然后在代码中使用这些包提供的函数和类型。 命令行参数获取使用 os.Args 获取命令行参数。 条件语句使用 if 条件语句来判断是否有命令行参数传递给程序。 字符串操作使用字符串连接操作将 Hello World 与命令行参数拼接在一起。 格式化输出使用 fmt.Println 函数将消息输出到标准输出。
注意如果没有传递参数给程序那么这段代码不会打印任何消息。如果传递了多个参数代码只会使用第一个参数并忽略其他参数。
在该目录下执行“go run hello.go ZYF”运行结果为“Hello World ZYF”。
二基本程序结构编写学习
src目录下创建chapter2
1.变量
前提chapter2目录下创建variables学习总结如下
变量声明 使用var关键字声明一个变量例如var x int。类型推断 可以使用:操作符进行变量声明和赋值Go会根据右侧的值自动推断变量类型例如y : 5。变量赋值 使用赋值操作符给变量赋值例如x 10。多变量声明 可以同时声明多个变量例如var a, b, c int。变量初始化 变量可以在声明时进行初始化例如var name string John。零值 未初始化的变量会被赋予零值数字类型为0布尔类型为false字符串类型为空字符串等。短变量声明 在函数内部可以使用短变量声明方式例如count : 10。
新建fib_test.go背景简单实用斐波那契数列进行练习
package variablesimport testingfunc TestFibList(t *testing.T) {a : 1b : 1t.Log(a)for i : 0; i 5; i {t.Log( , b)tmp : aa bb tmp a}
}func TestExchange(t *testing.T) {a : 1b : 2// tmp : a// a b// b tmpa, b b, at.Log(a, b)
}下面逐个解释代码中涉及的知识点 package variables: 声明了一个名为 variables 的包这是一个用于测试的包名。 import testing: 导入了Go语言的测试框架 testing 包用于编写和运行测试函数。 func TestFibList(t *testing.T) { ... }: 定义了一个测试函数 TestFibList该函数用于测试斐波那契数列生成逻辑。这是一个测试函数的标准命名以 Test 开头接着是被测试的函数名。 在测试函数内部声明了两个整数变量 a 和 b并将它们初始化为 1这是斐波那契数列的前两个数。使用 t.Log(a) 打印变量 a 的值到测试日志中。使用循环来生成斐波那契数列的前 5 个数每次迭代都会将 b 的值打印到测试日志并更新 a 和 b 的值以生成下一个数。 func TestExchange(t *testing.T) { ... }: 定义了另一个测试函数 TestExchange该函数用于测试变量交换的逻辑。 在测试函数内部声明了两个整数变量 a 和 b并分别将它们初始化为 1 和 2。使用注释的方式展示了一种变量交换的写法通过中间变量但实际上被注释掉了。然后使用 a, b b, a 这一行代码来实现 a 和 b 的交换这是Go语言中的一种特有的交换方式不需要额外的中间变量。使用 t.Log(a, b) 打印交换后的变量值到测试日志中。
2.常量
前提chapter2目录下创建constant学习总结如下
常量声明 使用const关键字声明一个常量例如const pi 3.14159。常量赋值 常量的值在声明时必须被赋值一旦赋值后不可修改。枚举常量 可以使用一组常量来模拟枚举例如 const (Monday 1Tuesday 2// ...
) 类型指定 常量的类型也可以被指定例如const speed int 300000。常量表达式 常量可使用表达式计算例如const secondsInHour 60 * 60。无类型常量 常量可以是无类型的根据上下文自动推断类型。例如const x 5会被推断为整数类型。
新建constant_test.go写代码如下
package constantimport testingconst (Monday 1 iotaTuesdayWednesday
)const (Readable 1 iotaWritableExecutable
)func TestConstant1(t *testing.T) {t.Log(Monday, Tuesday)
}func TestConstant2(t *testing.T) {a : 1 //0001t.Log(aReadable Readable, aWritable Writable, aExecutable Executable)
}
下面逐个解释代码中涉及的知识点 package constant: 声明了一个名为 constant 的包这是一个用于测试的包名。 import testing: 导入了Go语言的测试框架 testing 包用于编写和运行测试函数。 const (...): 定义了两个常量块。 第一个常量块中使用了 iota 常量生成器来定义了一系列从 1 开始递增的常量。在这个例子中Monday 被赋值为 1Tuesday 被赋值为 2Wednesday 被赋值为 3。iota 在常量块中每次被使用时会递增一次因此后续的常量会依次递增。 第二个常量块中使用了 iota 来定义了一系列按位左移的常量。在这个例子中Readable 被赋值为 1Writable 被赋值为 2二进制中的 10Executable 被赋值为 4二进制中的 100。位运算中左移操作可以将二进制数向左移动指定的位数。 func TestConstant1(t *testing.T) { ... }: 定义了一个测试函数 TestConstant1用于测试第一个常量块中定义的常量。 使用 t.Log(Monday, Tuesday) 打印常量 Monday 和 Tuesday 的值到测试日志中。 func TestConstant2(t *testing.T) { ... }: 定义了另一个测试函数 TestConstant2用于测试位运算和常量的使用。 在测试函数内部声明了一个整数变量 a并将其初始化为 1即二进制中的 0001。使用位运算和按位与操作来检查变量 a 是否具有 Readable、Writable 和 Executable 属性。例如aReadable Readable 表达式检查 a 的二进制表示是否含有 Readable 标志位。使用 t.Log() 打印三个表达式的结果到测试日志中。
3.数据类型
前提chapter2目录下创建 type学习总结如下
主要数据类型说明
Go语言具有丰富的内置数据类型这些数据类型用于表示不同类型的值和数据。以下是对Go语言中一些主要数据类型的总结分析 整数类型Integer TypesGo语言提供不同大小的整数类型如int、int8、int16、int32和int64。无符号整数类型有uint、uint8、uint16、uint32和uint64。整数类型的大小取决于计算机的架构例如32位或64位。 浮点数类型Floating-Point TypesGo语言提供float32和float64两种浮点数类型分别对应单精度和双精度浮点数。 复数类型Complex TypesGo语言提供complex64和complex128两种复数类型分别对应由两个浮点数构成的复数。 布尔类型Boolean Type布尔类型用于表示真true和假false的值用于条件判断和逻辑运算。 字符串类型String Type字符串类型表示一系列字符。字符串是不可变的可以使用双引号或反引号来定义。 字符类型Rune Type字符类型rune用于表示Unicode字符它是int32的别名。通常使用单引号来表示字符如A。 数组类型Array Types数组是具有固定大小的同类型元素集合。声明数组时需要指定元素类型和大小。 切片类型Slice Types切片是对数组的一层封装是动态长度的可变序列。切片不保存元素只是引用底层数组的一部分。 映射类型Map Types映射是键值对的无序集合用于存储和检索数据。键和值可以是任意类型但键必须是可比较的。 结构体类型Struct Types结构体是一种用户定义的复合数据类型可以包含不同类型的字段每个字段有一个名字和类型。 接口类型Interface Types接口是一种抽象类型用于定义一组方法。类型实现了接口的方法集合即为实现了该接口。 函数类型Function Types函数类型表示函数的签名包括参数和返回值类型。函数可以作为参数传递和返回。 通道类型Channel Types通道是用于在协程之间进行通信和同步的一种机制。通道有发送和接收操作。 指针类型Pointer Types指针类型表示变量的内存地址。通过指针可以直接访问和修改变量的值。
Go语言的数据类型具有清晰的语法和语义支持丰富的内置功能。合理选择和使用不同的数据类型可以提高程序的效率和可读性。
具体代码展开分析
package mainimport fmttype Person struct {FirstName stringLastName stringAge int
}type Shape interface {Area() float64
}type Circle struct {Radius float64
}func (c Circle) Area() float64 {return 3.14 * c.Radius * c.Radius
}func add(a, b int) int {return a b
}func subtract(a, b int) int {return a - b
}type Operation func(int, int) intfunc main() {fmt.Println(整数类型Integer Types)var x int 10var y int64 100fmt.Println(x)fmt.Println(y)fmt.Println(浮点数类型Floating-Point Types)var a float32 3.14var b float64 3.14159265359fmt.Println(a)fmt.Println(b)fmt.Println(布尔类型Boolean Type)var isTrue bool truevar isFalse bool falsefmt.Println(isTrue)fmt.Println(isFalse)fmt.Println(字符串类型String Type)str1 : Hello, str2 : Go!concatenated : str1 str2fmt.Println(concatenated)fmt.Println(切片类型Slice Types)numbers : []int{1, 2, 3, 4, 5}fmt.Println(numbers)// 修改切片元素numbers[0] 10fmt.Println(numbers)// 切片操作subSlice : numbers[1:4]fmt.Println(subSlice)fmt.Println(映射类型Map Types)ages : map[string]int{Alice: 25,Bob: 30,Eve: 28,}fmt.Println(ages)fmt.Println(Alices age:, ages[Alice])// 添加新的键值对ages[Charlie] 22fmt.Println(ages)fmt.Println(结构体类型Struct Types)person : Person{FirstName: John,LastName: Doe,Age: 30,}fmt.Println(person)fmt.Println(Name:, person.FirstName, person.LastName)fmt.Println(接口类型Interface Types)var shape Shapecircle : Circle{Radius: 5}shape circlefmt.Println(Circle Area:, shape.Area())fmt.Println(函数类型Function Types)var op Operationop addresult : op(10, 5)fmt.Println(Addition:, result)op subtractresult op(10, 5)fmt.Println(Subtraction:, result)fmt.Println(通道类型Channel Types)messages : make(chan string)go func() {messages - Hello, Go!}()msg : -messagesfmt.Println(msg)fmt.Println(指针类型Pointer Types)x 10var ptr *intptr xfmt.Println(Value of x:, x)fmt.Println(Value stored in pointer:, *ptr)*ptr 20fmt.Println(Updated value of x:, x)
}下面逐个解释代码中涉及的知识点 type Person struct { ... }: 定义了一个结构体类型 Person表示一个人的信息包括 FirstName、LastName 和 Age 字段。 type Shape interface { ... }: 定义了一个接口类型 Shape该接口要求实现一个方法 Area() 返回一个 float64 类型。 type Circle struct { ... }: 定义了一个结构体类型 Circle表示一个圆的半径。 func (c Circle) Area() float64 { ... }为 Circle 类型实现了 Shape 接口的 Area() 方法用于计算圆的面积。 func add(a, b int) int { ... }: 定义了一个函数 add用于执行整数相加操作。 func subtract(a, b int) int { ... }: 定义了一个函数 subtract用于执行整数相减操作。 type Operation func(int, int) int: 定义了一个函数类型 Operation它接受两个整数参数并返回一个整数结果。 main() { ... }: 程序的入口函数。
定义了多种不同类型的变量包括整数、浮点数、布尔、字符串、切片、映射、结构体、接口、函数、通道和指针类型。演示了不同类型变量的初始化、赋值、访问以及基本操作。使用切片操作提取部分切片。演示了映射的使用包括添加新的键值对和访问键值对。演示了结构体的定义和初始化并访问结构体字段。展示了接口的使用将 Circle 类型赋值给 Shape 类型变量并调用接口方法。演示了函数类型的定义和使用将不同函数赋值给 Operation 类型变量并进行调用。使用通道来实现并发通信通过匿名函数在 goroutine 中发送和接收消息。演示了指针的使用包括创建指针变量、通过指针修改变量的值等操作。
Go语言中类型转换说明
Go语言支持类型转换但需要注意一些规则和限制。类型转换用于将一个数据类型的值转换为另一个数据类型以便在不同的上下文中使用。以下是有关Go语言中类型转换的一些重要信息 基本类型之间的转换 可以在基本数据类型之间进行转换但是必须注意类型的兼容性和可能导致的数据丢失。例如从int到float64的转换是安全的但从float64到int可能导致小数部分被截断。 显示类型转换 在Go中使用强制类型转换来显式指定将一个值转换为另一个类型。语法是destinationType(expression)。例如float64(10)。 非兼容类型之间的转换 对于不兼容的类型编译器不会自动进行转换。例如不能直接将一个string类型转换为int类型。 类型别名的转换 如果有类型别名Type Alias在转换时需要注意使用别名的兼容性。
以下是一些示例来展示类型转换
package mainimport fmtfunc main() {// 显式类型转换var x int 10var y float64 float64(x)fmt.Println(y)// 类型别名的转换type Celsius float64type Fahrenheit float64c : Celsius(25)f : Fahrenheit(c*9/5 32)fmt.Println(f)
}