go语言下划线、变量和常量

1、下划线

"_"是特殊标识符,用来忽略结果。

1.1. 下划线在import中

复制代码
 在Golang里,import的作用是导入其他package。

import 下划线(如:import hello/imp)的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。这个时候就可以使用 import引用该包。即使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数。 示例:

代码结构

复制代码
    src 
    |
    +--- main.go            
    |
    +--- hello
           |
            +--- hello.go

package main

import _ "./hello"

func main() {
    // hello.Print() 
    //编译报错:./main.go:6:5: undefined: hello
}

hello.go

复制代码
package hello

import "fmt"

func init() {
    fmt.Println("imp-init() come here.")
}

func Print() {
    fmt.Println("Hello!")
}

输出结果:

复制代码
    imp-init() come here.

两种不一样的导入方式例子

复制代码
    import "database/sql"
    import _ "github.com/go-sql-driver/mysql"

第二个import就是不直接使用mysql包,只是执行一下这个包的init函数,把mysql的驱动注册到sql包里,然后程序里就可以使用sql包来访问mysql数据库了。

1.2. 下划线在代码中

复制代码
package main

import (
    "os"
)

func main() {
    buf := make([]byte, 1024)
    f, _ := os.Open("/Users/***/Desktop/text.txt")
    defer f.Close()
    for {
        n, _ := f.Read(buf)
        if n == 0 {
            break    

        }
        os.Stdout.Write(buf[:n])
    }
}

解释1:

复制代码
    下划线意思是忽略这个变量.

    比如os.Open,返回值为*os.File,error

    普通写法是f,err := os.Open("xxxxxxx")

    如果此时不需要知道返回的错误值

    就可以用f, _ := os.Open("xxxxxx")

    如此则忽略了error变量

解释2:

复制代码
    占位符,意思是那个位置本应赋给某个值,但是咱们不需要这个值。
    所以就把该值赋给下划线,意思是丢掉不要。
    这样编译器可以更好的优化,任何类型的单个值都可以丢给下划线。
    这种情况是占位用的,方法返回两个结果,而你只想要一个结果。
    那另一个就用 "_" 占位,而如果用变量的话,不使用,编译器是会报错的。

2、变量

2.1. 变量声明

Go语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。并且Go语言的变量声明后必须使用。

2.2. 标准声明

Go语言的变量声明格式为:

复制代码
    var 变量名 变量类型

变量声明以关键字var开头,变量类型放在变量的后面,行尾无需分号。 举个例子:

复制代码
    var name string
    var age int
    var isOk bool

2.3. 批量声明

每声明一个变量就需要写var关键字会比较繁琐,go语言中还支持批量变量声明:

复制代码
    var (
        a string
        b int
        c bool
        d float32
    )

2.4. 变量的初始化

Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil

当然我们也可在声明变量的时候为其指定初始值。变量初始化的标准格式如下:

复制代码
    var 变量名 类型 = 表达式

举个例子:

复制代码
    var name string = "pprof.cn"
    var sex int = 1

或者一次初始化多个变量

复制代码
    var name, sex = "pprof.cn", 1
类型推导

有时候我们会将变量的类型省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化。

复制代码
    var name = "pprof.cn"
    var sex = 1
短变量声明

在函数内部,可以使用更简略的 := 方式声明并初始化变量。

复制代码
package main

import (
    "fmt"
)
// 全局变量m
var m = 100

func main() {
    n := 10
    m := 200 // 此处声明局部变量m
    fmt.Println(m, n)
}
匿名变量

在使用多重赋值时,如果想要忽略某个值,可以使用匿名变量(anonymous variable)。 匿名变量用一个下划线_表示,例如:

复制代码
func foo() (int, string) {
    return 10, "Q1mi"
}
func main() {
    x, _ := foo()
    _, y := foo()
    fmt.Println("x=", x)
    fmt.Println("y=", y)
}

匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。 (在Lua等编程语言里,匿名变量也被叫做哑元变量。)

注意事项:

复制代码
    函数外的每个语句都必须以关键字开始(var、const、func等)

    :=不能使用在函数外。

    _多用于占位,表示忽略值。

3. 常量

相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。 常量的声明和变量声明非常类似,只是把var换成了const,常量在定义的时候必须赋值。

复制代码
    const pi = 3.1415
    const e = 2.7182

声明了pie这两个常量之后,在整个程序运行期间它们的值都不能再发生变化了。

多个常量也可以一起声明:

复制代码
    const (
        pi = 3.1415
        e = 2.7182
    )

const同时声明多个常量时,如果省略了值则表示和上面一行的值相同。 例如:

复制代码
    const (
        n1 = 100
        n2
        n3
    )

上面示例中,常量n1、n2、n3的值都是100

3.1. iota

iotago语言的常量计数器,只能在常量的表达式中使用。 iotaconst关键字出现时将被重置为0const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。

举个例子:

复制代码
    const (
            n1 = iota //0
            n2        //1
            n3        //2
            n4        //3
        )

3.2. 几个常见的iota示例:

使用_跳过某些值

复制代码
    const (
            n1 = iota //0
            n2        //1
            _
            n4        //3
        )

iota声明中间插队

复制代码
    const (
            n1 = iota //0
            n2 = 100  //100
            n3 = iota //2
            n4        //3
        )
    const n5 = iota //0

定义数量级 (这里的<<表示左移操作,1<<10表示将1的二进制表示向左移10位,也就是由1变成了10000000000,也就是十进制的1024。同理2<<2表示将2的二进制表示向左移2位,也就是由10变成了1000,也就是十进制的8。)

复制代码
    const (
            _  = iota
            KB = 1 << (10 * iota)
            MB = 1 << (10 * iota)
            GB = 1 << (10 * iota)
            TB = 1 << (10 * iota)
            PB = 1 << (10 * iota)
        )

多个iota定义在一行

复制代码
    const (
            a, b = iota + 1, iota + 2 //1,2
            c, d                      //2,3
            e, f                      //3,4
        )

参考文章:

https://www.fansimao.com/928438.html

https://www.fansimao.com/928451.html

相关推荐
JohnYan22 分钟前
Bun技术评估 - 03 HTTP Server
javascript·后端·bun
周末程序猿29 分钟前
Linux高性能网络编程十谈|C++11实现22种高并发模型
后端·面试
ZHOU_WUYI36 分钟前
Flask与Celery 项目应用(shared_task使用)
后端·python·flask
黑客老李1 小时前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
开开心心就好1 小时前
高效Excel合并拆分软件
开发语言·javascript·c#·ocr·排序算法·excel·最小二乘法
特立独行的猫a1 小时前
Nuxt.js 中的路由配置详解
开发语言·前端·javascript·路由·nuxt·nuxtjs
勤奋的知更鸟1 小时前
Java编程之原型模式
java·开发语言·原型模式
冒泡的肥皂1 小时前
强大的ANTLR4语法解析器入门demo
后端·搜索引擎·编程语言
珂朵莉MM1 小时前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
香蕉炒肉2 小时前
Java优化:双重for循环
java·开发语言