返回顶部
首页 > 资讯 > 精选 >Go中import导入包和变量初始化的方法
  • 120
分享到

Go中import导入包和变量初始化的方法

2023-06-30 04:06:50 120人浏览 八月长安
摘要

这篇“Go中import导入包和变量初始化的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go中import导入包和变量

这篇“Go中import导入包和变量初始化的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go中import导入包和变量初始化的方法”文章吧。

import导入包

搜索路径

import用于导入包:

import (    "fmt"    "net/Http"    "mypkg")

编译器会根据上面指定的相对路径去搜索包然后导入,这个相对路径是从GOROOT或GOPATH(workspace)下的src下开始搜索的。

假如go的安装目录为/usr/local/go,也就是说GOROOT=/usr/local/go,而GOPATH环境变量GOPATH=~/mycode:~/mylib,那么要搜索net/http包的时候,将按照如下顺序进行搜索:

/usr/local/go/srcnet/http~/mycode/src/net/http~/mylib/src/net/http

以下是go install搜索不到mypkg包时的一个报错信息:

can't load package: package mypkg: cannot find package "mypkg" in any of:        /usr/lib/go-1.6/src/mypkg (from $GOROOT)        /golang/src/mypkg (from $GOPATH)

也就是说,go总是先从GOROOT出先搜索,再从GOPATH列出的路径顺序中搜索,只要一搜索到合适的包就理解停止。当搜索完了仍搜索不到包时,将报错。

包导入后,就可以使用这个包中的属性。使用包名.属性的方式即可。例如,调用fmt包中的Println函数fmt.Println

包导入的过程

Go中import导入包和变量初始化的方法

首先从main包开始,如果main包中有import语句,则会导入这些包,如果要导入的这些包又有要导入的包,则继续先导入所依赖的包。重复的包只会导入一次,就像很多包都要导入fmt包一样,但它只会导入一次。

每个被导入的包在导入之后,都会先将包的可导出函数(大写字母开头)、包变量、包常量等声明并初始化完成,然后如果这个包中定义了init()函数,则自动调用init()函数。init()函数调用完成后,才回到导入者所在的包。同理,这个导入者所在包也一样的处理逻辑,声明并初始化包变量、包常量等,再调用init()函数(如果有的话),依次类推,直到回到main包,main包也将初始化包常量、包变量、函数,然后调用init()函数,调用完init()后,调用main函数,于是开始进入主程序的执行逻辑。

别名导入和特殊的导入方法

当要导入的包重名时会如何?例如network/convert包用于转换从网络上读取的数据,file/convert包用于转换从文件中读取的数据,如果要同时导入它们,当引用的时候指定convert.FUNC(),这个convert到底是哪个包?

可以为导入的包添加一个名称属性,为包设置一个别名。例如,除了导入标准库的fmt包外,自己还定义了一个mypkg/fmt包,那么可以如下导入:

package mainimport (    "fmt"    myfmt "mypkg/fmt")func main() {    fmt.Println()    myfmt.myfunc()   // 使用别名进行访问}

如果不想在访问包属性的时候加上包名,则import导入的时候,可以为其设置特殊的别名:点(.)。

import (    . "fmt")func main() {    Println()    // 无需包名,直接访问Println}

这时要访问fmt中的属性,必须不能使用包名fmt。

go要求import导入的包必须在后续中使用,否则会报错。如果想要避免这个错误,可以在包的前面加上下划线:

import (    "fmt"    _ "net/http"    "mypkg")

这样在当前包中就无需使用net/http包。其实这也是为包进行命名,只不过命名为"_",而这个符号又正好表示丢弃赋值结果,使得这成为一个匿名包。

下划线(_)在go中,下划线出现的频率非常高,它被称为blank identifier,可以用于赋值时丢弃值,可以用于保留import时的包,还可以用于丢弃函数的返回值。详细内容可参见官方手册:https://golang.org/doc/effective_go.html#blank

导入而不使用看上去有点多此一举,但并非如此。因为导入匿名包仅仅表示无法再访问其内的属性。但导入这个匿名包的时候,会进行一些初始化操作(例如init()函数),如果这个初始化操作会影响当前包,那么这个匿名导入就是有意义的。

远程包

现在通过分布式版本控制系统进行代码共享是一种大趋势。go集成了从gti上获取远程代码的能力。

例如:

$ go get GitHub.com/golang/example

在import语句中也可以使用,首先从GOPATH中搜索路径,显然这是一个URL路径,于是调用go get进行fetch,然后导入。

import (    "fmt"    "github.com/golang/example")

当需要从git上获取代码的时候,将调用go get工具自动进行fetch、build、install。如果workspace中已经有这个包,那么将只进行最后的install阶段,如果没有这个包,将保存到GOPATH的第一个路径中,并build、install。

go get是递归的,所以可以直接fetch整个代码树。

常量和变量的初始化

Go中的常量在编译期间就会创建好,即使是那些定义为函数的本地常量也如此。常量只允许是数值、字符(runes)、字符串或布尔值。

由于编译期间的限制,定义它们的表达式必须是编译器可评估的常量表达式(constant expression)。例如,1<<3是一个常量表达式,而math.Sin(math.Pi/4)则不是常量表达式,因为涉及了函数math.Sin()的调用过程,而函数调用是在运行期间进行的。

变量的初始化和常量的初始化差不多,但初始化的变量允许是"需要在执行期间计算的一般表达式"。例如:

var (    home   = os.Getenv("HOME")    user   = os.Getenv("USER")    gopath = os.Getenv("GOPATH"))

init()函数

Go中除了保留了main()函数,还保留了一个init()函数,这两个函数都不能有任何参数和返回值。它们都是在特定的时候自动调用的,无需我们手动去执行。

还是这张图:

Go中import导入包和变量初始化的方法

每个包中都可以定义init函数,甚至可以定义多个,但建议每个包只定义一个。每次导入包的时候,在导入完成后,且变量、常量等声明并初始化完成后,将会调用这个包中的init()函数。

对于main包,如果main包也定义了init(),那么它会在main()函数之前执行。当main包中的init()执行完之后,就会立即执行main()函数,然后进入主程序。

所以,init()经常用来初始化环境、安装包或其他需要在程序启动之前先执行的操作。如果import导入包的时候,发现前面命名为下划线_了,一般就说明所导入的这个包有init()函数,且导入的这个包除了init()函数外,没有其它作用。

以上就是关于“Go中import导入包和变量初始化的方法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Go中import导入包和变量初始化的方法

本文链接: https://lsjlt.com/news/327340.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go中import导入包和变量初始化的方法
    这篇“Go中import导入包和变量初始化的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go中import导入包和变量...
    99+
    2023-06-30
  • Go基础教程系列之import导入包(远程包)和变量初始化详解
    import导入包 搜索路径 import用于导入包: import ( "fmt" "net/http" "mypkg" ) 编译器会根据上面指定的相对路...
    99+
    2024-04-02
  • 2011-11-8 包变量的初始化
    http://www.itpub.net/thread-1499223-12-1.html 119楼 执行下列语句之后,我的屏幕上会显示什么? CREATE OR REPLACE...
    99+
    2024-04-02
  • 使用@Value为静态变量导入并使用导入的静态变量进行初始化方式
    目录1 问题描述2 问题结构2.1 服务方2.2 客户方3总结总结1 问题描述 在南京出差时,在开始开发,自己把一些相对紧密联系的不变得配置放进一个类中,这些字段为static的,待...
    99+
    2023-02-13
    @Value静态变量 静态变量导入 静态变量初始化
  • Go 的入口函数和包初始化的使用
    目录包 packagemain.main 函数:Go 应用的入口函数package main注意其他包也可以拥有 main 函数或方法重点引子init 函数:Go 包的初始化函数和 ...
    99+
    2024-04-02
  • java变量的初始化方法是什么
    Java变量的初始化方法有以下几种:1. 声明变量时直接赋值:可以在声明变量时直接为其赋初值,例如:```javaint num =...
    99+
    2023-09-15
    java
  • Java类变量和成员变量初始化的过程
    这篇文章主要讲解了“Java类变量和成员变量初始化的过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java类变量和成员变量初始化的过程”吧!一、类的初始化对于类的初始化:类的初始化一般只...
    99+
    2023-06-17
  • wordpress全局变量$wpdb初始化并声明为全局变量的方法
    首先从wordpress程序index.php入手: 复制代码代码如下:define('WP_USE_THEMES', true); require( dirname( __FILE__ ) . '/wp-blog-heade...
    99+
    2024-04-02
  • 深入探索Golang中的数据类型与变量初始化
    深入探索Golang中的数据类型与变量初始化在Go语言中,数据类型和变量的初始化是我们常常需要面对的问题。正确的数据类型和变量的初始化可以确保程序的健壮性和正确性。在本文中,我们将深入探索Golang中的数据类型和变量初始化的相关知识,并给...
    99+
    2023-12-23
    数据类型 Golang 变量初始化
  • 怎么在go语言中初始化结构体的成员变量
    本篇文章给大家分享的是有关怎么在go语言中初始化结构体的成员变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。初始化方法:1、使用“ins := 结构体类型名{字段1:值,字段...
    99+
    2023-06-15
  • C#中的变量初始化形式是什么
    本篇内容主要讲解“C#中的变量初始化形式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中的变量初始化形式是什么”吧!C# 中的变量初始化变量通过在等号后跟一个常量表达式进行初始化(赋值...
    99+
    2023-06-17
  • ABAP和Go语言的初始化操作方法是什么
    本篇内容主要讲解“ABAP和Go语言的初始化操作方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ABAP和Go语言的初始化操作方法是什么”吧!# ABAPGo作用同上:Kubernete...
    99+
    2023-06-03
  • Go语言基础变量的声明及初始化示例详解
    目录一、概述二、声明变量三、编译器推导类型的格式【一定要赋值】四、短变量声明并初始化五、匿名变量——没有名字的变量六、注意七、案例一、概述 变量的功能是存储用户的数据 二、声明变量 ...
    99+
    2024-04-02
  • java中Map和List初始化的方法有哪些
    这篇文章主要介绍了java中Map和List初始化的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中Map和List初始化的方法有哪些文章都会有所收获,下面我们一起来看看吧。Map和List初...
    99+
    2023-07-05
  • Python中类的初始化特殊方法
    什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化的方法$__init__$,类似于java中的构造器,这个就是特殊方法,也叫作魔术方法。简单来说,特殊方法可以给你设计的类加上一些神奇...
    99+
    2022-06-04
    初始化 方法 Python
  • Perl中二维数组的引用和初始化方法
    这篇文章主要讲解了“Perl中二维数组的引用和初始化方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Perl中二维数组的引用和初始化方法”吧!Perl二维数组的引用和初始化Perl二维数组...
    99+
    2023-06-17
  • java中Map和List初始化的N种方法总结
    目录Map和List初始化方法第一种方法(常用方法)第二种方法(双括号初始化法)第三种,stream初始化初始化Map和List小技巧(指定容量+匿名内部类初始化)总结Map和Lis...
    99+
    2023-03-22
    java中Map初始化 java中List初始化 Map和List初始化方法
  • Spring中Bean初始化和销毁的方法是什么
    今天小编给大家分享一下Spring中Bean初始化和销毁的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sprin...
    99+
    2023-07-06
  • Go Struct初始化风格的抉择方法是什么
    本篇内容主要讲解“Go Struct初始化风格的抉择方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go Struct初始化风格的抉择方法是什么”吧!三...
    99+
    2024-04-02
  • SpringBoot中的Bean初始化方法是什么
    本篇内容介绍了“SpringBoot中的Bean初始化方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注解说明使用注解: @Post...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作