ReviewGoLang Learn Data Day 3
原贴地址:https://www.cnblogs.com/Reisentyan/p/20206814
最近一直很忙,于是理所当然的在企业训练营的技术面中落败了。
现在正在准备秋招,目标是全栈吧,不过为了以防万一,全栈要是没进去就倒闭的情况,还是各种东西都先学一点。首当其冲就是学go语言了,现代应该挺流行这个。不过因为太久没看,语法全忘记了,这里重新学一遍。
金八银九,我来了。
一、 概述
本文档基于现有的 main.go 源码,提炼并归档了 Go 语言的核心基础语法、复合数据结构及面向对象特性的应用规范。源码完整展示了从变量声明到复杂结构体操作的执行链路。
二、 核心模块解析
1. 变量与控制流
- 变量声明 :代码中混合使用了标准声明(
var a int)、类型推导(var b = "string")及简短声明(n := 1),并定义了常量(const P)。 - 条件与循环 :
- 使用无括号的
if语句进行逻辑分支判断。 - 通过
for关键字实现了两种遍历模式:标准步进循环(for i:=1; i<=10; i++)以及替代传统while语法的条件循环(for n <= 10)。
- 使用无括号的
2. 函数设计 (Functions)
- 标准与多返回值 :实现了基础函数
add以及支持多返回值的函数devide,演示了 Go 语言在应对复合计算结果输出时的标准范式。 - 占位符与格式化 :通过
fmt.Printf与fmt.Println的对比调用,明确了定制化排版输出与标准换行输出的设计隔离。
3. 复合数据结构 (Data Structures)
- 切片 (Slice) :构建了动态数组
qiepian,演示了索引访问、定点修改,并使用append函数实现了切片的内存动态扩容。 - 映射 (Map) :初始化了
scores键值对字典,并结合len()函数演示了全局通用长度获取机制。 - Range 迭代 :在
getall函数中,通过for _, va := range语法,展示了忽略索引(使用空白标识符_)并安全遍历切片元素的标准解法。
4. 面向对象特性 (Structs & Methods)
- 结构体定义 :声明了
Person与Dog结构体,用于封装多维属性(如姓名、年龄、健康值),替代了传统面向对象语言中的class概念。 - 指针接收者方法 :
- 为结构体绑定了特定行为(如
Bark,Play,GetHealthy)。 - 严格规范了指针接收者 (
\*Dog) 的使用场景:在Play()方法中成功通过指针直接修改了实例对象的内部状态(Healthy -= 10),并确保了GetHealthy()具备明确的返回值类型。
- 为结构体绑定了特定行为(如
三、 结论
该代码完整跑通了 Go 语言的新手核心链路,印证了 Go 语言"极简、正交、注重实用"的设计哲学。代码逻辑闭环良好,无冗余报错,具备向下继续扩展高级特性(如接口、并发)的坚实基础。
注意到,代码要写成这样:
go
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func devide(a, b int) (int, int) {
return a / b, a % b
}
func getall(qiepian []int) int {
var res int = 0
for _, va := range qiepian {
res += va
}
return res
}
type Person struct {
Name string
Age int
}
func (p *Person) show() {
fmt.Println("我是:", p.Name, "。我", p.Age, "岁")
}
type Dog struct {
Name string
Healthy int
}
func (dog *Dog) Bark() {
fmt.Println("wof")
}
func (dog *Dog) Play() {
dog.Healthy -= 10
}
func (dog *Dog) GetHealthy() int {
return dog.Healthy
}
func main() {
var a int = 10
var b = "string"
var c int = 100
const P = 3.1415926
if a >= 10 {
a -= 10
}
for i := 1; i <= 10; i++ {
a += i
}
n := 1
for n <= 10 {
c += n
n += 1
}
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(c + a)
fmt.Println(P)
fmt.Println(add(a, c))
q, r := devide(a, c)
//Printf 定制格式化输出,强制第一个参数是字符串
//Println 标准换行输出,每个参数中间插入空格,最后加上换行
fmt.Printf("%d,%d", q, r)
fmt.Println()
for i := 1; i <= 20; i++ {
if i%2 == 0 {
fmt.Printf("%d ", i)
}
}
qiepian := []int{10, 20, 30}
fmt.Println()
fmt.Println(qiepian)
fmt.Println(qiepian[0])
qiepian[1] = 200
qiepian = append(qiepian, 100, 200)
fmt.Println(qiepian)
fmt.Println("qiepian", getall(qiepian))
scores := map[int]string{1: "a", 2: "b", 3: "c"}
var len int = len(scores)
for i := 1; i <= len; i++ {
fmt.Println(scores[i])
}
fmt.Println("len:", len)
per := Person{Name: "小王", Age: 18}
fmt.Println(per.Name, per.Age)
fmt.Println(per)
per.show()
dog := Dog{"王", 100}
dog.Bark()
dog.Play()
fmt.Println(dog.GetHealthy())
}