设为首页 加入收藏

TOP

20个Golang片段让我不再健忘(一)
2023-07-23 13:27:01 】 浏览:101
Tags:Golang 段让我

前言

本文使用代码片段的形式来解释在 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 均为文件夹,也可以说是 packagehelper.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
首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何让你的结构体更高效 下一篇从源码分析 Go 语言使用 cgo 导致..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目