Go中的下划线

1.下划线在import中

  在Golang里,import的作用是导入其他package,但是今天在看beego框架时看到了import 下划线,不知其意,故百度而解之。

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

main.go

package main

import _ "hello/imp"

func main() {
    //imp.Print() //编译报错,说:undefined: imp
}

init.go

package imp

import "fmt"

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

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

输出结果:

imp-init() come here.

2.下划线在代码

package main

    import (
        "os"
    )

    func main() {
        buf := make([]byte, 1024)
        f,_ := os.Open("/Users/samchen/Music/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:

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

补充:

import "database/sql"
    import _ "github.com/go-sql-driver/MysqL"

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

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...