Golang入门指南

756 阅读5分钟

Golang入门指南

本文旨在为前端开发者提供一些学习Golang的帮助

Hello World

准备工作

Go官网下载地址:golang.org/dl/

配置环境变量

  • GOROOT

    指的是golang 的安装路径

  • GOBIN

    go install编译后的存放路径。

  • GOPATH

    它指的是GO运行环境中的环境变量:$GOPATH

    内部存在三个子目录

    • src 存放网上下载的源代码
    • pkg 编译是生成的中间文件
    • bin 编译后生成的可执行文件,一般将其加入**$PATH**变量,这样就可以直接在终端中使用这些可执行文件

Hello Golang

选择某一文件夹下,新建一个main.go文件,输入以下代码

package main

import "fmt"

func main() {
  fmt.Println("Hello World")
  fmt.Println("Hello Golang")
}

然后在终端输入go run main.go,即可成功显示Hello WorldHello Golang

init函数与main函数

go语言中,存在两种特殊的函数,init函数main函数

init函数

init函数用于包(package)的初始化,它具有以下特征

  • init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
  • 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
  • init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
  • 一个包可以拥有多个init函数,按照呈现给编译器的顺序被调用
  • 一个包只能初始化一次,即使是从多个包导入的

main函数

go语言的入口函数

func main() {
  // 函数体
}

示例

  • 非main包(package)是不可以run的

    package test
    import "fmt"
    
    func foo()  {
      fmt.Println("a")
    }
    
    foo()
    

    执行go run test.go,会得到以下报错:

  • 普通函数无法直接在非main函数体外执行

    package main
    import "fmt"
    
    func foo()  {
      fmt.Println("a")
    }
    
    foo()
    

    执行go run test.go, 会得到以下报错:

正确演示:
package main
import "fmt"

func foo()  {
  fmt.Println("foo")
}

func main() {
  foo()
}

go run 与 go build

在node中,我们执行文件只有node inde.js这一种方式,而对于golang而言,它本身支持静态编译,编译好,直接可以放服务器运行,而go run 与go build 正是这种区别

  • go run [文件]

    本地运行该文件

  • go build [文件]

    编译源文件,生成可执行文件

对于上面的Hello World代码,我们执行go build,即可得到可执行文件

点击main文件,可以再次看到Hello WorldHello Golang

命名

Go语言中的命名都遵循一个简单的命令规则:

一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。

关键字

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

特殊名字

内建常量: true false iota nil

内建类型: int int8 int16 int32 int64
          uint uint8 uint16 uint32 uint64 uintptr
          float32 float64 complex128 complex64
          bool byte rune string error

内建函数: make len cap new append copy close delete
          complex real imag
          panic recover

这些名字虽然不是关键字,但可以在定义中重新使用它们。如下面代码所示:

package main
import "fmt"

func main() {
	var true = 1
	fmt.Println("true为: ", true)
}

执行后如下图所示

声明与使用

如果一个名字如果在函数内部定义,那么它只在这个函数内部有效。如果是在函数外部定义,那么它将在当前包的所有文件中可以访问

如下面代码所示

package main

import "fmt"

func main() {
	fmt.Println(foo)
	bar()
}
var foo = "foo"
func bar()  {
	fmt.Println("bar")
}

而如果在函数内先使用后声明则会报错, 如下面代码所示

package main

import "fmt"

func main() {

	fmt.Println(foo) // 未解析的引用 'foo'
	bar() // 未解析的引用 'bar'

	var foo = "foo" // 未使用的变量 'foo'
	bar := func() { // 未使用的变量 'bar'
		fmt.Println("bar")
	}
}

大小写

名字的开头字母的大小写决定了名字在保外的可见性。如果一个名字是大写字母开头,且必须在函数外部定义的名字,它将是导出的,即可以被外部的包访问,例如fmt包的Println函数就是导出,可以在fmt包外部访问。

而对于包名而言,一般总是用小写字母

驼峰优先

Go语言一般推荐使用驼峰式命名

声明

包声明

包要求在同一个目录下中的所有文件的第一行添加如下代码,以标记该文件归属的包

package 包名

包的特性如下

  • 一个目录下的同级文件归属同一个包

    如下面代码所示

    // test/foo
    package test
    import "fmt"
    
    func Foo() {
    	fmt.Println("foo")
    }
    
    // test/bar
    package test
    import "fmt"
    
    func Bar() {
    	fmt.Println("bar")
    }
    
    // main.go
    package main
    
    import "./test"
    
    func main() {
    	test.Foo()
    	test.Bar()
    }
    
  • 包名可以与其目录名不同名

  • 包名为 main 的包为应用程序的入口包,编译源码没有 main 包时,将无法编译输出可执行的文件。

变量声明

Go语言的变量声明格式为

var 变量名 变量类型
var 变量名 变量类型 = 表达式

如:var name string = "Bob"

批量声明

Go语言也支持批量声明,其格式为:

var (
  a string
  b init
  c bool
  d float32
)

短变量声明

在函数内部,可以采用:=的方式来声明并初始化变量

package main

import "fmt"

func main() {
	foo := "foo"
	fmt.Println(foo)
}

匿名变量

go语言的函数是允许返回多个返回值。在使用过程时,常常会出现只想使用一个返回值的情况。此时如果另一个返回值也用变量命名,便会提示未使用该变量。

在这种情况下,我们就可以使用匿名变量,来忽略某个值,匿名变量用一个下划线_来表示

package main

import "fmt"

func foo() (string, int)  {
	return "foo", 1
}

func main() {
	x, _ := foo()
	_, y := foo()
	fmt.Println(x)
	fmt.Println(y)
}

常量

常量的命名方式与JS相同,都是使用const关键字,且常量在定义的时候必须赋值

const pi = 3.1415
const e = 2.7182

// 批量声明
const (
  pi = 3.1415
  e = 2.7182
)

const 同时声明多个变量时,如果省略值则表示它与上面一行的值一致,如

const (
  a = 100
  b
  c
)

// a,b,c的值都为100

参考资料