Golang基础

本文详细介绍了Golang的基础知识,包括下载、配置国内镜像、依赖管理(GOPATH、GOVENDOR、go mod)、程序结构、基本变量类型、常量、条件和循环、函数、指针、数组、切片、Map、结构体、接口、函数式编程、资源管理和错误处理、单元测试以及并发编程(协程和通道)。文章通过实例深入浅出地讲解了Go语言的核心概念和实践技巧。
摘要由CSDN通过智能技术生成

下载

官方下载地址:https://studygolang.com

// 查看是否安装成功
go version

// 查看环境变量
go env

配置国内镜像

// 设置国内镜像(适用于1.13及以上版本)
go env -w GOPROXY=https://goproxy.cn,direct

// 设置go module为on
go env -w GO111MODULE=on

// 安装goimports工具
go get golang.org/x/tools/cmd/goimports

说明:

  • goimports是在go文件保存时,会自动格式化代码,自动导入/删除相关的包

依赖管理

依赖管理的三个阶段:GOPATH、GOVENDOR、go mod

GOPATH

  • 默认在~/go(unix,linux),%USERPROFILE%\go(windows)

  • 相当于一个全局的库,所有的项目代码、第三方库都放在下面

GOVENDOR

  • 每个项目都有自己的vendor目录,用来存放第三方库
  • 一般使用第三方的依赖管理工具来管理项目的vendor目录,例如:dep、golide…

go mod

用来取代GOPATH和GOVENDOR,在项目中使用go.mod文件来管理引入的包、版本等,引入的包存储在%GOPATH%/pkg/mod下面。

  • 由go命令统一管理,用户不必关心目录结构
  • 初始化:go mod init
  • 增加依赖:go get…
  • 更新依赖:go get[@version],go mod tidy
  • 将历史项目(GOPATH…)迁移到go mod:go mod init, go build ./…

说明:

go语言不允许在同一个包下,存在多个main函数,既,一个包只允许存在一个main函数

程序结构

  1. 必须在源文件指明这个文件属于哪个包;package main 表示一个可独立执行的程序,每个Go程序都包含一个名为main的包
  2. 当标识符以一个大写字母开头时,表示其他包可用(public),以小写开头时,表示只能本包使用(protected)

基本变量类型

  • bool,string 布尔类型和字符串

  • (u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr 整数(ptr表示指针)

  • byte,rune 字节类型和字符类型(go特有的)

  • float32,float64,complex64,complex128 浮点型和复数

可以使用括号+类型((int) xx),进行强制类型转换。

变量

  1. 声明格式: var name [type]
  2. 没有初始化时,默认零值:数值类型(0)、布尔类型(false)、字符串("")、其他(nil)
  3. 如果没有指定类型时,会根据值自动判断类型
  4. 省略var(只能在函数体中出现): v_name := value
  5. 全局变量允许只声明不使用,局部变量不允许,声明之后,必须使用

使用var关键字

// 示例
var a, b c bool
var s1, s2 string = "hello", "world"
// 可以放在函数内(局部变量),或者放在包内(全局变量)

使用:=符合定义

// 示例,相当于省略了var
s := "hello"

注:使用:=定义变量时,不可以使用在全局变量,只能使用在函数内

常量(枚举)

  • 声明格式: const name [type] = value
  • 特殊常量iota: 在const关键字出现时将被重置为0,const中每新增一行常量声明,都将使iota计数一次(可以理解为const语句块中的行索引)

条件和循环

  1. if…else if…else… 条件语句,需要注意的是:条件不需要加上括号()
  2. for循环(注意不需要括号):for init; condition; post {}
  3. for each range循环:对字符串、数组、切片等进行迭代输出元素

函数

  1. 定义:func function_name(xxx)[return_type]{}
  2. 可返回多个值:func func_name(xxx) (xx,xx) { return xx, xx}
  3. 函数作为参数:func func_name(op func(xxx) xx){}
  4. 没有默认参数、可选参数

示例:

func apply(op func(int, int) int, a, b int) int {
   
  fmt.Printf("calling %s with %d, %d\n", runtime.FuncForPC(reflect.ValueOf(op).Point()).Name(), a, b)
  return op(a, b)
}

指针

  • 指标变量声明:var name *type
  • 赋值(&):name = &a
  • 获取指针所指向的内容:*name
  • 指向指针的指针变量(多了一个*):
    • 声明:var name **type
    • 访问指向的内容:**name

示例:

var a int = 2
var ptr *int =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值