Go语言入门[一] 从HelloWorld开始| 青训营

官方指路

我的第一个Go程序

  • 相信大家的第一个程序都源于一个简单但令人开心的Hello World,那么我们的第一个Go程序也从Hello World开始
go 复制代码
package main

import "fmt"

func main() {
    /* 我的第一个Go程序 */
    fmt.Println("Hello, World!")
}
  • 如果你使用的是JetBrainsGoLand,点击绿色的运行按钮,就可以在控制台看到了你的第一个程序发出的信息

  • 如果不是/你想用控制台对这个程序进行编译,我们可以这样

bash 复制代码
# 注意,这里的hello.go是你编写的go文件名字
$ go run hello.go 
Hello, World!
  • 很像Python,对吧?我们可以通过go run $filename$的形式直接编译并执行这样一个文件

  • 但是如果要像Java那样先编译成二进制文件再执行,又该怎么操作呢?

bash 复制代码
$ go build hello.go 

# 这个hello,就是编译出来的二进制文件
$ ls
hello    hello.go

$ ./hello 
Hello, World!
  • 这样的效果是一样的

分析一下Hello World

  • 别看这样的一个程序简单,实际上它具备了一般Go程序的大部分结构,让我们一行行分析原来的hello.go
go 复制代码
package main
  • 这一行代码定义了包名,我们必须在源文件的第一行(不包括注释哦)指明这个文件属于哪个包。package main表示这是一个可独立执行的程序,每个Go应用程序都必须包含一个名为main的包
go 复制代码
import "fmt"
  • 这一行告诉了Go编译器这个程序需要使用fmt包,fmt包实现了格式化I/O与其相关的函数
go 复制代码
func main(){
    ...
}
  • 与其它语言相同,这一行是程序的入口,表示程序从这里开始执行。除了init 函数,main一般是程序中第一个执行的函数

  • 注意函数的大括号一定要紧跟小括号 ,像C/C++不同行的形式是不被允许的

go 复制代码
/* 我的第一个Go程序 */
  • 这一行是语言中的注释,与其它语言相同 //...表示单行注释,/* ... */表示多行注释
go 复制代码
fmt.Println("Hello World!")
  • 将字符输出到控制台,这行代码相当于
go 复制代码
fmt.Print("Hello World!\n")
  • 标识符(常量、变量类型、函数名、结构字段等)如果以大写字母开头 ,例如下文实验中的Func1,使用这种形式的标识符对象可以被外部包的代码使用 (详情可以参考下文实验),类似于其它语言中的public属性;但是如果以小写字母开头 ,则对外部包不可见(即使已经在开头导入),但是该标识符对象在整个包的内部仍然可用,类似其它语言中的private属性。(试试把下文中的Func1改为func1,看看是否还能正常工作?)

注意

  • 文件名与包名没有直接关系 :像是我们之前的哪个hello.go,它的文件名和包名main并不相同

  • 文件夹名和包名没有直接关系 :别看Java里包装时需要package的名称和文件夹需要严格一致,Go则自由得多

  • 同一个文件夹下的文件只能有一个包名,否则编译报错

  • 为了验证以上说法,我们可以进行这样一个实验

bash 复制代码
# 建立一个这样的文件结构

- hello.go
- Another
    -- Class1.go
    -- Class2.go
  • hello.go中调用Another文件夹下两个程序的函数,看看会发生什么
go 复制代码
package main
import (
    "fmt"
    "./Another"
)
func main(){
    fmt.Println("Hello World!")
    fmt.Println(AnotherPackage.Func1())
    fmt.Println(AnotherPackage.Func2())
}
  • Another中两个程序的内容
go 复制代码
// Class1.go
package AnotherPackage
func Func1() string {
    return "This is func1 in Another from AnotherPackage!"
}
// Class2.go
package AnotherPackage
func Func2() string {
    return "This is func2 in Another from AnotherPackage!"
}
  • 运行一下
bash 复制代码
$ go run hello.go
  • 结果输出如下
  • 这里的Class1.goClass2.go都在package AnotherPackage下,但是文件夹又和它名字不同,可以看到是可以正常运行的

  • 为了验证第三点,我们把Class2.go的内容修改一下

go 复制代码
package NoPackage
func Func2() string {
    return "This is func2 in Another from AnotherPackage!"
}
  • 再次运行,看看如何?
  • 不出所料报错了。证明虽然 Go允许文件夹和包名不同,但必须保证一个文件夹下的所有文件的包名必须相同

基础知识

标记

  • Go程序一定由多个标记组成,常见的标记有

    • 关键字:struct,func,go,val等

    • 标识符:main,Println等

    • 常量:1234,"字符串"等

    • 符号:. {} 等

行分割符

  • 类似于其它脚本语言,Go程序无需分号进行每行语句的分隔,对每行语句的解析都由编译器自己进行

  • 但如果你又希望像C/C++那样酷炫的压行写法,Go也支持带有分号的语义分析。也就是说,如果你希望在同一行里写下多行语句,此时就必须使用分号分隔了(但是Go的开发者没有这样的坏习惯,它们一般都分多行书写,毕竟这样更简洁明了,不是吗?)

注释

  • 单行与多行注释的语法和C/C++完全相同。还是那句话,咱只讨厌两种人,一种是不写注释的别人,和要求自己写注释的笨蛋。

标识符

  • 和一般的语言相同,标识符用于命名程序实体。规则也相似,一般以字母或下划线开头
go 复制代码
// 合法的标识符
hello he12 heas___ _dsadas _111
// 非法标识符
123(数字开头) func(关键字) 9+8(含有运算符)

字符串连接

  • Java相同,两个字符串可以直接使用+号连接
go 复制代码
package main
import "fmt"
func main(){
    fmt.Println("Hello"+" "+"World"+"!")
}

关键字

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

预定义标识符

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

空格

  • 为了提高代码的可读性,我们都会在程序里各个地方加上空格,毕竟谁都不想看到堆在一起的代码.....对吧?

  • Go中变量的声明必须使用空格隔开

go 复制代码
var x string
const Pi float64 = 3.1415926
  • 关键字和表达式之间也要用空格隔开
go 复制代码
if 2 < 3 {
    ...
}
  • 函数调用时,函数名和等号之间也要有空格,函数的参数之间也要有空格
go 复制代码
result := add(2, 3)
  • 如果你使用的是GoLand,那么这些你都无需担心,IDE会帮助你做好格式化代码的工作

参考资料

Go 语言教程 | 菜鸟教程

掘金|后端入门 - Go 语言原理与实践

相关推荐
Find1 个月前
MaxKB 集成langchain + Vue + PostgreSQL 的 本地大模型+本地知识库 构建私有大模型 | MarsCode AI刷题
青训营笔记
理tan王子1 个月前
伴学笔记 AI刷题 14.数组元素之和最小化 | 豆包MarsCode AI刷题
青训营笔记
理tan王子1 个月前
伴学笔记 AI刷题 25.DNA序列编辑距离 | 豆包MarsCode AI刷题
青训营笔记
理tan王子1 个月前
伴学笔记 AI刷题 9.超市里的货物架调整 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵1 个月前
分而治之,主题分片Partition | 豆包MarsCode AI刷题
青训营笔记
三六1 个月前
刷题漫漫路(二)| 豆包MarsCode AI刷题
青训营笔记
tabzzz1 个月前
突破Zustand的局限性:与React ContentAPI搭配使用
前端·青训营笔记
Serendipity5651 个月前
Go 语言入门指南——单元测试 | 豆包MarsCode AI刷题;
青训营笔记
wml1 个月前
前端实践-使用React实现简单代办事项列表 | 豆包MarsCode AI刷题
青训营笔记
用户44710308932421 个月前
详解前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记