GO声明和作用域

作用域


go语言一共有如下几个作用域:

  • 全局作用域:所有的关键字和内置类型、函数都拥有全局作用域
  • package作用域:一个包中声明的变量、常量、函数、类型等都拥有包作用域,在同一个包中可以任意访问
  • 文件作用域:一个文件中通过import导入的包名,只在当前文件有效
  • 函数作用域以及for、if、{}自定义作用域,函数的参数、reciever、返回值都拥有函数作用域,for、if、{}内部的变量只拥有最小作用域。

同一作用域的符号不能重名

声明


label

go语言也支持label,可以向C/C++一样通过goto跳转到指定label。
同时go的break和continue还是指定label来跳出或继续不通的循环层级。

空标记

空标记_仅仅是一个占位符,通过将函数返回值赋值给空标记,可以避免编译器提示未使用的变量。

导出符号

一个包中的导出符号可以在包的外部被访问,只有满足一下条件的符号才是导出符号

  • 符号名首字母大写
  • 属于包作用域或者是一个首字母大写的类型的成员

常量声明和iota

常量声明可以有类型和没有类型,无类型常量的精度至少满足如下条件

  • 整数常量不少于256位
  • 浮点常量尾数不少于256位且指数不少于32位(最新的1.8好像改成了16位)

常量声明使用关键字const
const a int32 = 123 //有类型常量,32位
const b = 102934810923801238 //无类型常量 不少于256位
可以使用声明列表和iota来实现类型C的enum的功能

const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Partyday
    numberOfDays
)

这里面涉及两个规则:
1、在常量列表中,如果一行省略了赋值,则默认使用上一行的结果
2、iota是go的内置常量,他会在常量列表中每行递增
同时iota将会在每一个常量列表中清零即:

const (
    a = iota  // = 0
    b         // = 1
)
const (
    c = iota // = 0
)

类型声明

类型声明使用type关键字

type IntArray [16]int //same as c/c++的typedef
type (                //类型声明也支持列表形式
    Int32 int32
    Int64 int64
)
type Reader interface {   //interface 
    Read() []byte 
}
type TreeNode struct {  //struct
    left, right *TreeNode
    value interface{}
}

一个类型声明不会继承任何的基本类型的方法集合

// A Mutex is a data type with two methods, Lock and Unlock.
type Mutex struct         { /* Mutex fields */ }
func (m *Mutex) Lock()    { /* Lock implementation */ }
func (m *Mutex) Unlock()  { /* Unlock implementation */ }

// NewMutex has the same composition as Mutex but its method set is empty.
type NewMutex Mutex

// The method set of the base type of PtrMutex remains unchanged,
// but the method set of PtrMutex is empty.
type PtrMutex *Mutex

// The method set of *PrintableMutex contains the methods
// Lock and Unlock bound to its anonymous field Mutex.
type PrintableMutex struct {
    Mutex
}

// MyBlock is an interface type that has the same method set as Block.
type MyBlock Block

变量声明

类型声明有两种方式,var类型声明和短类型声明:=

var类型声明

这种类型声明可以在任何需要声明变量的地方出现

var a int32 = 1
var a = 1
var (
    a = 1
    b = "string"
    c = 1.0
)

短类型声明

短类型声明只能出现在函数体中

a := []byte{}
a := make([]byte, 10)
a := 5

短类型声明在一下情况可以重复声明

  • 多赋值
  • 多赋值中除了_外至少有一个新的变量
  • 重复声明的变量类型不能改变
    a := 1
    a, b := 1, 2 //ok
    c, a := 1, 2.0 //not ok, type diffrent
    a, b := 1, 2 //not ok, no new variable 

函数声明和方法声明

函数声明使用func关键字,方法就是拥有receiver的函数

func function(param int) (int, bool)  //函数
func (r int32) method(param int) (int, bool)  //方法

函数可以有多返回值,具体的细节go语言基本数据类型中有描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值