当前位置: 首页 > news >正文

Go语言基础之下划线

09.Go语言基础之下划线

一、下划线的作用

作用:“_”是特殊标识符,用来忽略结果

二、下划线在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.

三、下划线在代码中

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:

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

补充:

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

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

相关文章:

  • Go基础之切片
  • Go语言基础之map
  • Go语言基础之函数
  • Go语言之依赖管理
  • GO基础之关于切片操作的技巧
  • Go语言的主要特征
  • GO语言之Init函数和main函数
  • Golang内置类型和函数
  • Go高级之Map实现原理
  • windows将pycharm的 默认CMD 终端更改为git bash
  • Anaconda Windows环境搭建与基本使用
  • git 配置ssh key
  • 图文:pycharm远程连接Linux开发与调试代码(超级详细)
  • Python 链接SQL server
  • django使用原生SQL查询示例
  • JS 中的深拷贝与浅拷贝
  • 11111111
  • happypack两次报错的问题
  • JDK 6和JDK 7中的substring()方法
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • socket.io+express实现聊天室的思考(三)
  • tensorflow学习笔记3——MNIST应用篇
  • 产品三维模型在线预览
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 漂亮刷新控件-iOS
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​力扣解法汇总946-验证栈序列
  • # include “ “ 和 # include < >两者的区别
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八)Flask之app.route装饰器函数的参数
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (一)基于IDEA的JAVA基础12
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 无限分类
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [2669]2-2 Time类的定义
  • [acm算法学习] 后缀数组SA
  • [AIGC codze] Kafka 的 rebalance 机制
  • [BetterExplained]书写是为了更好的思考(转载)
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C#]扩展方法
  • [C++]类和对象【下】