当前位置: 首页 > article >正文

Golang初识

 

        Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,他们最终的目标是设计一种适应网络和多核时代的C语言。所以Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语言”,当然从各种角度看,Go语言确实是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想。但是Go语言更是对C语言最彻底的一次扬弃,它舍弃了C语言中灵活但是危险的指针运算,还重新设计了C语言中部分不太合理运算符的优先级,并在很多细微的地方都做了必要的打磨和改变。

        Go语言是一种开源的静态类型编程语言,它的设计目标是提供一种简单、高效、可靠的编程语言,适用于构建大规模的软件系统。Go语言具有以下特点和概念:

  • 并发编程:Go语言原生支持轻量级的并发,通过goroutine和channel来实现。这使得编写高效并发程序变得更加容易。
  • 快速编译:Go语言的编译速度非常快,可以快速构建和部署应用程序,提高开发效率。
  • 内存管理:Go语言拥有自动垃圾回收机制,可以帮助开发者更轻松地管理内存,减少内存泄漏和段错误的问题。
  • 丰富的标准库:Go语言的标准库提供了许多强大的功能和工具,包括网络编程、并发控制、加密解密等,开发者可以直接使用这些库来提高开发效率。

一、从一个main函数初见Golang语法注意点

package main // 程序的包名
import (
	"fmt"
	"time"
)

//import "fmt"
//import "time"

// main函数
func main() { // 函数的左花括号一定是和函数在同一行的,否则编译错误
	// golang中的表达式,加“;”和不加都可以,建议还是不加
	fmt.Println("hello go")
	time.Sleep(1 * time.Second)
}

        学习了C++,想必这些东西都不是很陌生。

  • 包声明:编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main。
  • 引入包:其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。
  • 函数,和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。
  • 变量:Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
  • 语句/表达式:在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
  • 注释:和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

        比如说,上面的代码,引入了time包,在main函数中就可以使用Sleep方法让程序睡眠1s。

二、常见的四种变量声明方式与多变量声明方式

1.四种变量声明方式

package main

import "fmt"

// 四种变量的声明方式

func main() {
	// 方法一:声明一个变量 默认的值是0
	var a int
	fmt.Println("a = ", a)
	fmt.Printf("type of a: %T\n", a)

	// 方式二:声明一个变量,初始化一个值
	var b int = 100
	fmt.Println("b = ", b)
	fmt.Printf("type of b: %T\n", b)

	var bb string = "abcd"
	fmt.Println("bb = ", bb)
	fmt.Printf("type of bb: %T\n", bb)

	// 方式三:在初始化的时候,可以省去数据类型,通过值自动匹配当前的变量的数据类型
	var c = 120
	fmt.Println("c = ", c)
	fmt.Printf("type of c: %T\n", c)

	// 方法四:省去var关键字,直接自动匹配
	e := 100
	fmt.Println("e = ", e)
	fmt.Printf("type of e: %T\n", e)
}

        最常用的方式为方式四,直接使用冒号等号,go会自动匹配数据类型并进行初始化。

        方式一,方式二,方式三可以用来声明全局变量,方式四不支持声明全局变量。

package main

import "fmt"

var ga int
var gb = 100
gc := 100

func main() {

	fmt.Println("ga = ", ga)
	fmt.Println("gb = ", gb)
	fmt.Println("gc = ", gc)
}

2、声明多个变量

package main

import "fmt"


func main() {
    var xx, yy int = 100, 200
	fmt.Println("xx = ", xx, "yy = ", yy)
	var kk, ll = 100, "abcd"
	fmt.Println("kk = ", kk, "ll = ", ll)
	var (
		vv int  = 100
		jj bool = true
	)
	fmt.Println("vv = ", vv, ", jj = ", jj)
}

三、常量const与iota

package main

import "fmt"

// 可以在const()中添加一个关键字iota,每行的iota都会累加1
const (
	BEIJING = iota
	SHANGHAI
	XIAN
)

const (
	a, b = iota + 1, iota + 2
	c, d
	e, f
	g, h = iota * 2, iota * 3
)

func main() {
	// 常量(只读操作)
	const length int = 10
	fmt.Println("length = ", length)

	fmt.Println("BEIJING = ", BEIJING)
	fmt.Println("SHANGHAI = ", SHANGHAI)
	fmt.Println("XIAN = ", XIAN)
	
	fmt.Println("a = ", a, ", b = ", b)
	fmt.Println("c, d = ", c, ", d = ", d)
	fmt.Println("e = ", e, ", f = ", f)
	fmt.Println("g = ", g, ", h = ", h)
}

        可以在const()中添加一个关键字iota,每行的iota都会累加1,注意:const后面用的是小括号。

四、Golang中函数的多返回值的三种写法

package main

import "fmt"

func fool(a string, b int) int {
	fmt.Println("a = ", a)
	fmt.Println("b = ", b)
	c := 100
	return c
}

func fool2(a string, b int) (int, int) {
	fmt.Println("a = ", a)
	fmt.Println("b = ", b)
	return 666, 777
}

func fool3(a string, b int) (r1 int, r2 int) {
	r1 = 100
	r2 = 400
	return
}

func fool4(a string, b int) (r1, r2 int) {
	return 100, 200
}
func main() {
	c := fool("hello", 100)
	fmt.Println(c)

	res1, res2 := fool2("hello", 100)
	fmt.Println("res1 = ", res1)
	fmt.Println("res2 = ", res2)
	
	res1, res2 = fool3("hello", 100)
}

五、init函数与import导包

main.go

package main

import (
	"Gocode/init/lib1"
	"Gocode/init/lib2"
)

func main() {
	lib1.Lib1Test()
	lib2.Lib2Test()
}

lib1.go

package lib1

import "fmt"

func Lib1Test() {
	fmt.Println("lib1Test......")
}

func init() {
	fmt.Println("lib1 init()......")
}

lib2.go

package lib2

import "fmt"

func Lib2Test() {
	fmt.Println("lib2Test......")
}

func init() {
	fmt.Println("lib2 init......")
}

特别注意:
        包中的方法的名称,首字母大写的才是公有方法,才能被其他包导入,然后被调用。

        main方法中,先导入了lib1包,lib1包会看看还有没有要引入的包,没有的话就去初始化包中的const和var值,然后执行init()方法,然后导入完lib1包后,lib2包执行同样的操作,知道main中的包全部导入完了之后,再初始化const和var的值,然后再执行main包中的init,然后执行main()方法,执行完之后 退出exit。

制作包的时候,项目路径如下:

 六、import匿名及别名导包方式

        Golang语言中,如果你导入了一个包,但是没有使用包中的方法,那么在编译的时候会报错。例如:

        但是在有些情况下,我不使用包中的方法,但是我希望这个包的init()方法能被执行,这时候,在不使用的包的前面加一个下划线和空格,这样就可以啦!

package main

import (
	_ "Gocode/init/lib1"
	"Gocode/init/lib2"
)

func main() {
	// lib1.Lib1Test()
	lib2.Lib2Test()
}

        这样的方法叫做匿名导包方式。

package main

import (
	_ "Gocode/init/lib1"
	mylib2 "Gocode/init/lib2"
)

func main() {
	// lib1.Lib1Test()
	mylib2.Lib2Test()
}

        如代码所示,我给lib2包起了一个名称叫做mylib2,那么我在调用方法的时候,就可以使用这个别名mylib2,调用包中的方法,这个方式叫做别名导包方式。

        还有一种方式,在包名前面加上点空格,即就是相当于将lib2包的方法全部导入到main包中,那么我在调用的时候就不需要写lib.LibTest()了,直接调用LibTest()即可。


http://www.kler.cn/a/517048.html

相关文章:

  • composer安装指定php版本, 忽略平台原因导致的报错
  • 抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
  • 双目立体校正和Q矩阵
  • 阿里巴巴开发规范手册MySQL
  • 08-ArcGIS For JavaScript-通过Mesh绘制几何体(Cylinder,Circle,Box,Pyramid)
  • doris:腾讯云 COS导入数据
  • vue3中为什么引入setup,引入setup是为了解决什么问题,setup的执行时机是什么?返回值是什么
  • linux数据压缩
  • 14-6-1C++的list
  • Elixir语言的数据结构
  • 利用现有模型处理面部视频获取特征向量(4)
  • 下载Visual Studio Community 2019
  • 科技快讯 | 2025商业新愿景;豆包大模型1.5 Pro正式发布;ChatGPT每月产生260吨二氧化碳
  • jenkins-k8s pod方式动态生成slave节点
  • 3.2 Go 返回值详解
  • ansible 批量按用户名创建kerberos主体,并分发到远程主机
  • docker 部署 java 项目详解
  • GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。
  • Python网络爬虫中的编码乱码如何解决
  • SpringBoot使用Kafka如何保证消息不丢失
  • Qt中的connect函数
  • mysql学习笔记-数据库的设计规范
  • 在Qt中实现点击一个界面上的按钮弹窗到另一个界面
  • Xcode各个历史版本下载地址
  • 一文速通stack和queue的理解与使用
  • 根据条件更改el-tree的字体颜色