Heim  >  Artikel  >  Backend-Entwicklung  >  Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen

Go语言进阶学习
Go语言进阶学习nach vorne
2023-07-21 13:07:131381Durchsuche

Paket

Paket kann als Speicherung mehrerer .go.go的文件夹但是这个文件夹下面的第一行的package后面跟的不再是main了而是文件名,就像这样。

目录

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen

clacmain.go Ordner, aber die erste Zeile unter diesem Ordner package

🎜 folgt nicht mehr 🎜🎜main🎜🎜aber der Dateiname,🎜einfach so. 🎜

🎜Table of Contents🎜

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen🎜🎜

clac🎜🎜and🎜🎜main.go🎜🎜Dateien haben die gleiche Ebene . 🎜🎜

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

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


包的注意事项

如果这个文件夹要当包使用文件夹名中不能包含_ 文件夹下的add.go

第一行不再是
main

而是文件夹名 🎜🎜clac 🎜🎜同理🎜🎜sub.go 🎜🎜第一行也是。🎜🎜

🎜🎜🎜🎜

_🎜🎜。🎜🎜🎜🎜🎜🎜🎜<h2 cid="n15" mdtype="heading" style='break-after: avoid-page;break-inside: avoid;font-size: 1.75em;margin-top: 1rem;margin-bottom: 1rem;font-weight: bold;line-height: 1.225;cursor: text;padding-bottom: 0.3em;border-bottom: 1px solid rgb(238, 238, 238);white-space: pre-wrap;font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;text-align: start;'><span md-inline="plain">Paket importieren</span></h2> </h2> <p cid="n16" 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"> Oben wissen wir, wie das Paket definiert ist. </span></p> <p cid="n17" 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">Und in und </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);Hintergrundfarbe: rgb(243, 244, 244);Rahmenradius: 3px;Padding-rechts: 2px;Padding-links: 2px;Schriftgröße: 0,9em;">main.go<code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);background-color: rgb(243, 244, 244);border-radius: 3px;padding-right: 2px;padding-left: 2px;font-size: 0.9em;">main.go同级的项目目录下建了一个clac包。

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

那我们如何在main.goA clac

Paket.

clacDas Paket enthält zwei Dateien, eine ist

add.go🎜🎜One is🎜🎜 sub.go🎜🎜Beide Ordner sind da sind entsprechende Methoden. 🎜Eine Frage? ? ? 🎜

main.go🎜🎜 Verwenden Sie zum Aufrufen das oben erstellte Paket Wie sieht es mit der Methode aus? 🎜🎜🎜🎜Hier geht es darum, sie zu importieren. 🎜🎜🎜🎜🎜Beispielcode🎜🎜🎜<section class="code-snippet__fix code-snippet__js"><pre class="brush:swift;toolbar:false;">package main import ( &quot;a3_course/clac&quot; ) func main() { clac.Add() clac.Sub() }</pre></section></p> <p cid="n24" 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">执行结果</span><br></p> <p style="text-align: center;margin-bottom: 0px;"><img src="https://img.php.cn/upload/article/001/272/559/2678ba4c1e75cc82009e741f62a2b4a3-1.png" alt="Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen" ></p> <p cid="n26" 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">可以看到在</span><span md-inline="code" spellcheck="false"><code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px ;Grenze -style: solid;border-color: rgb(231, 234, 237);background-color: rgb(243, 244, 244);border-radius: 3px;padding-right: 2px;padding-left: 2px;font -size: 0.9em;">main.gomain.go中成功调用了clac包中的代码。


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

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

包中的代码。

🎜

注:🎜🎜导入包只需要导入到文件夹即可就可以调用下面所有的方法和属性不再需要🎜🎜包名.xx.go🎜🎜这种方式。🎜🎜🎜🎜如上述导入🎜🎜calc code>🎜🎜不管🎜🎜<code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234 , 237);Hintergrundfarbe: rgb(243, 244, 244);Rahmenradius: 3px;Padding-rechts: 2px;Padding-links: 2px;Schriftgröße: 0,9em;">calc🎜 🎜下面有几个🎜🎜.go 🎜🎜文件里面的方法和属性都可以随便调用.🎜🎜🎜🎜🎜🎜🎜

导入包注意事项

上述我是直接通过

import (
   "a3_course/clac"
)

这种方式导入包的但是在你们那可能不太行。

因为我使用的是go mod所以通过项目目录/包名导入。

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen

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

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


可见性

可见性在其他语言中有的叫私有成员之类的称呼在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
}

访问私有变量报错信息。

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen


结构体可见性的问题

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

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)
}

执行结果

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen

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

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

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


包别名

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

示例代码

package main


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


func main() {
    cl.Add()
}

执行结果

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen


匿名导入包

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

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

嗯...这个匿名导入包主要要跟包的一个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() {


}

执行结果

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen

" ;Rahmenfarbe: RGB(231, 234, 237);Hintergrundfarbe: RGB(243, 244, 244);Rahmenradius: 3px;Padding-rechts: 2px;Padding-links: 2px;Schriftgröße: 0,9 em;">add.go

sub.goadd.gosub.go下的init方法。

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

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

init方法比main下的init方法。

init

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

注:🎜🎜🎜包的🎜🎜init🎜🎜方法不能写参数也不能有返回值🎜🎜init cid="n87" 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, serifenlos;font-size: 16px;text-align: start;">🎜 init🎜🎜方法比🎜🎜main🎜🎜方法更提前一步执行🎜🎜🎜 🎜。🎜🎜Die Reihenfolge, in der die Init-Methode ausgeführt wird, wenn mehrere Pakete verschachtelt und importiert werden bedeutet

main.go
importiert

other

anderePaket importiert

inner<img src="https://img.php.cn/upload/article/001/272/559/f156e701a948d06890eda7a662276b47-7.png" alt="Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen" ></codestil></p>Tasche, Nistpuppe. <p cid="n91" mdtype="paragraph" style="max-width:90%"Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;'><span md-inline="plain"></span><span md-inline="code" spellcheck="false">Werfen wir zunächst einen Blick auf die Ausführungsergebnisse<code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);background-color: rgb(243, 244, 244);border-radius: 3px;padding-right: 2px;padding-left: 2px;font-size: 0.9em;">main.go导入了otherother包导入了inner

执行结果是innerinnerinit方法先执行然后是ohterinit方法。

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

方法先执行然后是andere

Bringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen

init🎜🎜方法。🎜🎜

import🎜🎜就执行被导入包的🎜🎜<code style="font-family: var(--monospace);vertikal-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);background -color: rgb(243, 244, 244);border-radius: 3px;padding-right: 2px;padding-left: 2px;font-size: 0.9em;">init🎜🎜方法。🎜🎜 🎜🎜它的图应该是这样子的.🎜🎜🎜🎜🎜

意思是mainmain导入了ohter那就执行otherinit方法。

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

那就执行
andere

的🎜🎜 init🎜🎜方法。🎜🎜🎜🎜 🎜但是在导入🎜🎜andere🎜🎜时发现🎜🎜other🎜🎜导入了🎜🎜inner🎜🎜那就执行🎜 🎜inner🎜🎜的🎜🎜init🎜🎜方法。🎜🎜🎜🎜🎜🎜 🎜

Zusammenfassung

Oben haben wir die grundlegenden Pakete von Go kennengelernt, wie man Pakete erstellt , Pakete organisiert , Vorsichtsmaßnahmen für den Import von Paketen . Paketberechtigungsprobleme (alle sichtbar beginnend mit Großbuchstaben), Anonymer Import von Paketen, Init-Methode, Mehrere Init-Methoden Aufmerksamkeit zählt.

Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen Schritt für Schritt bei, die Pakete in der Go-Sprache zu verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Go语言进阶学习. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen