Go语言入门[一] 从HelloWorld开始

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mtWWBg3L-1691942583962)(D:\Study\notes\Go\golang.jpeg)]

官方指路

我的第一个Go程序

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

import "fmt"

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

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

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

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

$ go build hello.go 

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

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

分析一下Hello World

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

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

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

注意

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

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

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

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

# 建立一个这样的文件结构

- hello.go
- Another
    -- Class1.go
    -- Class2.go
  • hello.go中调用Another文件夹下两个程序的函数,看看会发生什么
package main
import (
    "fmt"
    "./Another"
)
func main(){
    fmt.Println("Hello World!")
    fmt.Println(AnotherPackage.Func1())
    fmt.Println(AnotherPackage.Func2())
}
  • Another中两个程序的内容
// 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!"
}
  • 运行一下
$ go run hello.go
  • 结果输出如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sv4mDQE5-1691942583963)(D:\Study\notes\Go\result1.png)]

  • 这里的Class1.goClass2.go都在package AnotherPackage下,但是文件夹又和它名字不同,可以看到是可以正常运行的

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

package NoPackage
func Func2() string {
    return "This is func2 in Another from AnotherPackage!"
}
  • 再次运行,看看如何?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0a2ZK2B-1691942583963)(D:\Study\notes\Go\result2.png)]

  • 不出所料报错了。证明虽然 Go允许文件夹和包名不同,但必须保证一个文件夹下的所有文件的包名必须相同

基础知识

标记

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

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

    • 标识符:main,Println等

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

    • 符号:. {} 等

行分割符

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

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

注释

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

标识符

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

字符串连接

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

关键字

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

预定义标识符

appendboolbytecapclosecomplex
complex64complex128uint16copyfalsefloat32
float64imagintint8int16uint32
int32int64iotalenmakenew
nilpanicuint64printprintlnreal
recoverstringtrueuintuint8uintptr

空格

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

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

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

参考资料

Go 语言教程 | 菜鸟教程

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值