Maison  >  Article  >  développement back-end  >  Vous apprendre étape par étape à comprendre les packages en langage Go

Vous apprendre étape par étape à comprendre les packages en langage Go

Go语言进阶学习
Go语言进阶学习avant
2023-07-21 13:07:131397parcourir

Le package

peut être compris comme le stockage de plusieurs .go.go的文件夹但是这个文件夹下面的第一行的package后面跟的不再是main了而是文件名,就像这样。

目录

Vous apprendre étape par étape à comprendre les packages en langage Go

clacmain.go dossier mais la première ligne sous ce dossier package

🎜 n'est plus suivi de 🎜🎜main🎜🎜mais le nom du fichier,🎜juste comme ça. 🎜

🎜Table des matières🎜

Vous apprendre étape par étape à comprendre les packages en langage Go🎜🎜

clac🎜🎜et🎜🎜main.go🎜🎜les fichiers sont du même niveau . 🎜🎜

可以看到clac文件夹下的add.go第一行不再是main而是文件夹名 clac同理sub.go第一行也是。

这个只是单独的解释包的定义方式没有实际意义。

<span md-inline="plain"><br></span>

包的注意事项

如果这个文件夹要当包使用文件夹名中不能包含_文件夹下的🎜🎜第一行也是。🎜🎜<p cid=" n12 mdtype="paragraph" open sans neue helvetica arial sans-serif de police du texte start>🎜这个只是单独的解释包的定义方式没有实际意义。🎜🎜<p cid="n12" mdtype="paragraph" style="line-height: hériter; orphelins: 4; marge supérieure: 0,8em; marge -bas : 0,8em ;espace blanc : pré-enveloppement ;famille de polices : " open sans neue helvetica arial sans-serif taille de police du texte : start>🎜🎜🎜🎜</p> <h2 cid="n13" mdtype="heading" style="break-after: éviter-page;break-inside: éviter;font-size: 1.75em;margin-top: 1rem ;marge inférieure : 1rem ;épaisseur de police : gras ;hauteur de ligne : 1,225 ;curseur : texte ;padding-bottom : 0,3em ;bordure inférieure : 1 px solide RVB (238, 238, 238 );espace blanc : pré -wrap;font-family : " open sans neue helvetica arial sans-serif start>🎜包的注意事项🎜</h2>🎜🎜 <code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid; couleur de la bordure : RVB (231, 234, 237) ; couleur d'arrière-plan : RVB (243, 244, 244) ; rayon de la bordure : 3 px ; remplissage à droite : 2 px ; remplissage à gauche : 2 px ; taille de la police : 0,9 em. ;">_🎜🎜。🎜🎜🎜🎜🎜🎜🎜

Importer un package

Ci-dessus, nous savons comment le package est défini.

Et dans et 同级的项目目录下建了一个clac包。

clac包下有俩个文件一个是add.go一个是sub.go两个文件夹分别都有对应的方法。问题来了???

那我们如何在main.goA Il y a deux fichiers dans le package, l'un est add.goOne is

🎜 sub.go🎜🎜Les deux dossiers sont là sont des méthodes correspondantes. 🎜Une question ? ? ? 🎜

🎜Alors comment pouvons-nous 🎜🎜main.go🎜🎜 en utilisant le package créé ci-dessus pour l'appeler Et la méthode ? 🎜🎜🎜🎜Il s'agit de les importer. 🎜🎜🎜🎜🎜Exemple de code🎜🎜🎜

package main


import (
   "a3_course/clac"
)


func main() {
   clac.Add()
   clac.Sub()
}

执行结果

Vous apprendre étape par étape à comprendre les packages en langage Go

可以看到在main.gomain.go中成功调用了clac包中的代码。


注:导入包只需要导入到文件夹即可就可以调用下面所有的方法和属性不再需要包名.xx.go这种方式。

如上述导入calc不管calc下面有几个.go中成功调用了clac

包中的代码。<span md-inline="plain"><br></span>

🎜

注 :🎜🎜导入包只需要导入到文件夹即可就可以调用下面所有的方法和属性不再需要🎜🎜包名.xx.go🎜🎜这种方式。🎜🎜🎜🎜如上述导入🎜🎜所以通过项目目录/包名导入。

Vous apprendre étape par étape à comprendre les packages en langage Go

如果你没有使用go mod是传统的方式那么导入包需要从GOPATH/src进行导入这里不举例了。

如果还不会使用go mod记得爬楼看以往文章,上面有教程,一篇文章教会你如何使用Go语言Modules,记得要拥抱未来噢。

<span md-inline="plain"><br></span>

可见性

可见性在其他语言中有的叫私有成员之类的称呼在Go中就叫可见性。

Go中可见性很简单不管是变量还是函数还是结构体。

首字母大写在哪都能访问。

首字母小写只能在当前包使用。

示例

clac/add.go文件

package clac


import (
    "fmt"
)


//这是一个公开的变量
var Name = "张三"


//这是一个私有变量,只能在 clac 包中访问
var age = 18


//这是一个公开的函数
func Add() {
    fmt.Println("我是做加法的...")
}

main.go文件

func main() {
    clac.Add()
    clac.Sub()
    fmt.Println(clac.Name)
    //clac中的age是小写开头,属于私有变量,所以其他包不能访问
    //fmt.Println(clac.age) // cannot refer to unexported name clac.age
}

访问私有变量报错信息。

Vous apprendre étape par étape à comprendre les packages en langage Go


结构体可见性的问题

我们知道结构体是有字段的但是你想过结构体的字段大小写问题吗?

type Student struct {
    Name string
    age  int
}
//age是小写开头

结构体名开头是不是大写影响的主要是在其他包里面的调用权限问题。

结构体字段开头是不是大写主要影响的是调用里面字段的问题一个明显的问题就是序列化。

更多结构体的相关文章,可前往:Go语言基础之结构体(春日篇)

示例代码

package main


import (
    "encoding/json"
    "fmt"
)


type Student struct {
    Name string
    age  int
}


func main() {
    var s1 = Student{
        Name: "张三",
        age:  18,
}
    serializeBytes,err:=json.Marshal(s1)
    if err != nil {
        fmt.Println("序列化失败")
}
    serializeStr := string(serializeBytes)
    fmt.Println(serializeStr)
}

执行结果

Vous apprendre étape par étape à comprendre les packages en langage Go

会发现执行结果少了一个age

这是因为age小写开头属于私有变量。

但是json.Marshal(s1)这个已经属于其他包了所以访问不到age

<span md-inline="plain"><br></span>

包别名

我们在导入包时其实还可以自定义包名就像Python中的 from xx import xx as yy

示例代码

package main


//给 clac 包起别名
import cl "a3_course/clac"


func main() {
    cl.Add()
}

执行结果

Vous apprendre étape par étape à comprendre les packages en langage Go


匿名导入包

匿名导入包就是相当于不用这个包里面的东西。

可能有人就会问了那不用包里面的东西,那还导入作甚呢?

嗯...这个匿名导入包主要要跟包的一个init方法有关系咱们先继续看。

匿名导入包示例代码

package main


//前面有个 _ 就表示是匿名导入
import _ "a3_course/clac"


func main() {


}


包的init方法

其实每次导入其他包的时候都会执行包的init方法。

示例

//clac/add.go
package clac


import "fmt"


func init() {
  fmt.Println("clac/add.go/init")
}
func Sub() {
  fmt.Println("我是做减法的...")
}


//clac/sub.go
package clac


import "fmt"


func init() {
  fmt.Println("clac/sub.go/init")
}
func Sub() {
  fmt.Println("我是做减法的...")
}

main.go

package main


import _ "a3_course/clac"


func main() {


}

执行结果

Vous apprendre étape par étape à comprendre les packages en langage Go

可以 发现 我 虽然 是 匿名 导入包 但是 仍然 还是 执行 了 add.goadd.gosub.go下的init方法。

这就说明了一个问题导入一个包会执行这个包下面所有的init方法不管下面有几个.go文件。

注:包的init方法不能写参数也不能有返回值init方法只能在导入时调用不能主动调用。

init方法比mainsub.go下的init

🎜方法。🎜
🎜

🎜 这 就 说明 了 一 个 问题 导入 一 个 个 包会 执行 这 个 包 下面 所有 的 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 init

🎜🎜方法不管下面有几个🎜🎜.go🎜🎜文件。🎜🎜

注:🎜🎜🎜包的🎜🎜init🎜🎜方法不能写参数也不能有返回值🎜🎜init🎜🎜方法只能在导入时调用不能主动调用。🎜🎜

🎜 init🎜🎜方法比🎜🎜<span md-inline="plain"><br></span>

L'ordre dans lequel la méthode init est exécutée lorsque plusieurs packages sont imbriqués et importés

S'il y a plus de code, c'est directement comme indiqué dans l'image :

Vous apprendre étape par étape à comprendre les packages en langage Go

Ceci signifie导入了otherother包导入了innerotherpackage importé

intérieursac, poupée gigogne.

Vous apprendre étape par étape à comprendre les packages en langage Go

Jetons d'abord un coup d'œil aux résultats d'exécution🎜🎜🎜🎜🎜

执行结果是intérieurinnerinit方法先执行然后是ohterinit方法。

其实本质是碰到import就执行被导入包的init init

方法先执行然后是ohter

Vous apprendre étape par étape à comprendre les packages en langage Go

<span md-inline="plain">意思是</span><span md-inline="code" spellcheck="false"><code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);couleur d'arrière-plan : rgb(243, 244, 244);rayon de bordure : 3px;padding-right : 2px;padding-left : 2px;taille de police : 0,9em;">mainmain导入了ohter那就执行otherinit方法。

但是在导入ohter时发现other导入了inner那就执行innerinit导入了ohter

那就执行
init

方法。🎜🎜🎜🎜 🎜但是在导入🎜🎜autre🎜🎜导入了🎜🎜<span md-inline="plain">Résumé</span><p cid="n101" mdtype="paragraph" style='line-height: inherit;orphans: 4;margin-top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;'><span md-inline="plain"> Ci-dessus, nous avons appris les packages de base de Go, comment </span><span md-inline="strong"><strong> créer des packages </strong></span><span md-inline="plain">, </span><span md-inline="strong"><strong> organiser des packages </strong></span><span md-inline="plain">, </span><span md-inline="strong"><strong> précautions pour l'importation de packages </strong> </span><span md-inline="plain">. </span><span md-inline="strong"><strong>Problèmes d'autorisation des packages (tous visibles commençant par des lettres majuscules)</strong></span><span md-inline="plain">, </span><span md-inline="strong"><strong>Importation anonyme des packages</strong></span><span md-inline="plain">, </span><span md-inline="strong"><strong>méthode d'initialisation</strong></span><span md-inline="plain">, </span><span md-inline="strong"><strong>Méthodes d'initialisation multiples</strong> </span><span md-inline="plain">L'attention compte. </span></p>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer