关于golang中下划线(_)的语义说明

简介: 在阅读k8s代码的过程中,经常可以看到下划线出现在不同的地方,有时候我们并不清楚下划线代表的具体含义是什么,有什么作用,但是又会经常选择性的忽略这些细节,实际上却非常重要。 下面我来总结一下下划线(_)出现的三种场合 ### 用在返回值 这个应该是最简单的用途,比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写: ```go v1, v2

在阅读k8s代码的过程中,经常可以看到下划线出现在不同的地方,有时候我们并不清楚下划线代表的具体含义是什么,有什么作用,但是又会经常选择性的忽略这些细节,实际上却非常重要。
下面我来总结一下下划线(_)出现的三种场合

用在返回值

这个应该是最简单的用途,比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写:

v1, v2, _ := function(...)

用在变量(特别是接口断言)

例如我们定义了一个接口(interface):

type Foo interface {
     Say()
}

然后定义了一个结构体(struct)

type Dog struct {
}

然后我们希望在代码中判断Dog这个struct是否实现了Foo这个interface

var _ Foo = Dog{}

上面用来判断Dog是否实现了Foo, 用作类型断言,如果Dog没有实现Foo,则会报编译错误

用在import package

假设我们在代码的import中这样引入package:

import _ "test/foo"

这表示呢在执行本段代码之前会先调用test/foo中的初始化函数(init),这种使用方式仅让导入的包做初始化,而不使用包中其他功能
例如我们定义了一个Foo struct,然后对它进行初始化

package foo
import "fmt"
type Foo struct {
        Id   int
        Name string
}
func init() {
        f := &Foo{Id: 123, Name: "abc"}
        fmt.Printf("init foo object: %v\n", f)
}

然后在main函数里面引入test/foo

package main
import (
        "fmt"
        _ "test/foo"
)
func main() {
        fmt.Printf("hello world\n")
}

运行结果如下

init foo object: &{123 abc}
hello world

我们可以看到:在main函数输出"hello world"之前就已经对foo对象进行初始化了!

目录
相关文章
|
3月前
|
Go
Go语言导入包:探究点操作符、下划线和别名的妙用
Go语言导入包:探究点操作符、下划线和别名的妙用
29 0
|
编译器 Go Python
Go 中的空白标识符(下划线)
空白标识符是未使用的值的占位符。它由下划线(_)表示。由于空白标识符没有名称,因此它们也被称为匿名占位符。 在 Go 语言中, 不允许声明未使用的变量或导入语句。也就是说,我们无法声明变量并将其留下未使用。同样,如果您导入一个包,那么也必须使用它。 这个时候就需要一个空白标识符。
|
存储 Java 大数据
Go基础:下划线“_”、变量和常量、数组、slice
Go基础:下划线“_”、变量和常量、数组、slice
578 0
Go基础:下划线“_”、变量和常量、数组、slice
golang下划线(underscore) 总结
一、概述   "_" 可以简单理解为赋值但以后不再使用,在golang中使用的比较多,使用的场合也很多,稍作总结; 二、场景   1、import 1 import _ "net/http/pprof"   引入包,会调用包中的初始化函数,这种使用方式仅让导入的包做初始化,而不适用包中其他功能;   2、用在返回值 1 for _, v := range Slice {} 2 _, err := func()   表示忽略某个值。
1281 0
|
16天前
|
Go
go语言中的数据类型
go语言中的数据类型
13 0
|
21天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
21天前
|
安全 Go
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
|
21天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
3天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
21天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)