前言
本文使用代码片段的形式来解释在 go
语言开发中经常遇到的小功能点,由于本人主要使用 java
开发,因此会与其作比较,希望对大家有所帮助。
1. hello world
新手村的第一课,毋庸置疑。
package main
import "fmt"
func main() {
fmt.Printf("hello world")
}
2. 隐形初始化
package main
import "fmt"
func main() {
load()
}
func load() {
fmt.Printf("初始化..手动%s 不错\n", "1")
}
func init() {
fmt.Printf("隐形初始化。。\n")
}
在 go 中定义 init
函数,程序在运行时会自动执行。类似使 junit
的 [@before](https://my.oschina.net/u/3870904)
注解。
3. 多模块的访问
java
中 package
包的概念,go
是通过文件夹 + package
关键字来定义的。
一般而言,我们会通过go init
来创建项目,生成的go.mod
文件位于根目录。
常见的实践是,创建文件夹并且保持 package 名称与文件夹保持一致。这样 import
的永远是文件夹,遵循以上规则则意味着文件夹的名称即为模块名。
同一个 package
可以创建多个 .go
文件,虽然分布在不同的文件中。但是他们中的方法名称不能相同。需要注意,这里与 java
中不同类中方法可以重名不同。
此外,也没有诸如private、protected、public
等包访问权限关键字。只要定义的函数首字母为大写。则可以被外部成功调用。
来看一下示例:
go-tour
└── ch3
├── model
│ └── test
│ │ ├── testNest.go
│ └── helper.go
│ └── helper2.go
│
└── main.go
└── go.mod
此处,ch3、model、test
均为文件夹,也可以说是 package
。helper.go
位于 model
下,它的代码如下:
package model
import "fmt"
var AppName = "bot"
var appVersion = "1.0.0"
func Say() {
fmt.Printf("%s", "hello")
}
func init() {
fmt.Printf("%s,%s", AppName, appVersion)
}
再来看看 main.go
package main
import (
"ch3/model"
"ch3/model/test"
)
func main() {
model.Say()
}
显然它的调用是通过 packageName.MethodName()
来使用的。需要注意的是,一个 go.mod
下只能有一个 main
包。
4. 引用外部库
和 java
的 maven
类似,go
几经波折也提供了官方仓库。如下,通过 go get github.com/satori/go.uuid
命令即可安装 uuid
库,未指定版本,因此下载的为最新版本。
使用时是这样的:
package main
import (
"fmt"
uuid "github.com/satori/go.uuid"
)
func main() {
uuid := uuid.NewV4()
fmt.Printf("%s", uuid)
}
5. 数组字典和循环
直接看代码就是了。
package main
import "fmt"
var item []int
var m = map[int]int{
100: 1000,
}
var m2 = make(map[int]int)
func main() {
for i := 0; i < 10; i++ {
item = append(item, i)
m[i] = i
m2[i] = i
}
for i := range item {
fmt.Printf("item vlaue=%d\n", i)
}
for key, value := range m {
fmt.Printf("m:key=%d,value=%d\n", key, value)
}
for _, value := range m2 {
fmt.Printf("m2:value=%d\n", value)
}
}
- := 的形式只能在方法内
- 全局的只能用 var x=..
- map输出没有顺序
6. 结构体和JSON
go
中通过 struct
来定义结构体,你可以把它简单理解为对象。一般长这样。
type App struct {
AppName string
AppVersion string `json:"app_version"`
appAuthor string "pleuvoir"
DefaultD string "default"
}
我们经常在 java
程序中使用 fastjson
来输出 JSON字符串
。 go
中自带了这样的类库。
package main
import (
app2 "app/app" //可以定义别名
"encoding/json"
"fmt"
)
func main() {
a := app2.App{}
fmt.Printf("%s\n", a)
app := app2.App{AppName: "bot", AppVersion: "1.0.1"}
json, _ := json.Marshal(app) //转换为字符串
fmt.Printf("json is %s\n", json)
}
- 结构体中
JSON
序列化不会转变大小写,可以指定它输出的&nb