Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

Go语言进阶学习
Go语言进阶学习ke hadapan
2023-07-21 13:07:131396semak imbas

pakej

pakej boleh difahami sebagai menyimpan berbilang .go.go的文件夹但是这个文件夹下面的第一行的package后面跟的不再是main了而是文件名,就像这样。

目录

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

clacmain.go folder tetapi baris pertama di bawah folder ini pakej

🎜 tidak lagi diikuti oleh 🎜🎜utama🎜🎜tetapi nama fail,🎜begitu sahaja. 🎜

🎜Table of contents🎜

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go🎜🎜

🎜 clac🎜🎜and🎜🎜main.go🎜🎜fail adalah pada tahap yang sama . 🎜🎜

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

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


包的注意事项

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

第一行不再是
utama

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

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

🎜🎜🎜🎜

🎜包的注意事项🎜

🎜🎜如果这个文件夹要当包使用文件夹名中不能包含🎜🎜_🎜🎜。🎜🎜🎜🎜🎜🎜🎜

Pakej import

Di atas kita tahu bagaimana pakej itu ditakrifkan.

Dan dalam dan 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

pakej.

clacTerdapat dua fail di bawah pakej, satu ialah

add.go🎜🎜Satu ialah🎜🎜 sub.go🎜🎜Kedua-dua folder ada di sana adalah kaedah yang sepadan. 🎜A soalan? ? ? 🎜

🎜Lalu bagaimana kita 🎜🎜main.go🎜🎜 menggunakan pakej yang dibuat di atas untuk memanggilnya Bagaimana pula dengan kaedahnya? 🎜🎜🎜🎜Ini adalah mengenai mengimportnya. 🎜🎜🎜🎜🎜Contoh kod🎜🎜🎜

package main


import (
   "a3_course/clac"
)


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

执行结果

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

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


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

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

clac

包中的代码。

🎜🎜

注:🎜🎜导入包只需要导入到文件夹即可就可以调用下面最要导入到文件夹即可就可以调用下面所不再需要🎜🎜包名.xx.go🎜🎜这种方式。🎜🎜🎜🎜如上述导入🎜🎜calc kod>🎜🎜不管🎜🎜<code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234 , 237);warna latar belakang: rgb(243, 244, 244);jejari sempadan: 3px;padding-kanan: 2px;padding-left: 2px;font-size: 0.9em;">calc🎜 🎜下面有几个🎜🎜.go 🎜🎜文件里面的方法和属性都可以随便调用。🎜🎜🎜🎜🎜🎜🎜

导入包注意事项

上述我是直接通过

import (
   "a3_course/clac"
)

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

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

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

如果你没有使用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
}

访问私有变量报错信息。

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa 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)
}

执行结果

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

会发现执行结果少了一个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()
}

执行结果

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa 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() {


}

执行结果

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

. padu ;warna sempadan: rgb(231, 234, 237);warna latar belakang: rgb(243, 244, 244);jejari sempadan: 3px;padding-kanan: 2px;padding-left: 2px;saiz fon: 0.9 em;">add.go

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

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

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

init方法比main下的init方法。

这就说明了一个问题导入一个包会执行这个包下面所有的🎜🎜;-code family style:="-font vert] : 1px;gaya sempadan: pepejal;warna sempadan: rgb(231, 234, 237);warna latar belakang: rgb(243, 244, 244);jejari sempadan: 3px;padding-kanan: 2px;padding-left : 2px;font-size: 0.9em;">init🎜🎜方法不管下面有几个🎜🎜.go🎜🎜文件。🎜🎜

注:🎜🎜🎜包的🎜🎜init🎜🎜方法不能写参数也不能有返回值🎜 stylefamili:family🎜 var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);background-color: rgb(243, 244, 244) ;jejari sempadan: 3px;padding-kanan: 2px;padding-left: 2px;saiz fon: 0.9em;">init🎜🎜方法只能在导入时调用不能与用不能与用不能与用入时调用不能与用入时调用不能与。 cid="n87" mdtype="paragraph" style="line-height: inherit;anak yatim: 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;">🎜 init🎜🎜方法比🎜🎜utama🎜🎜方法更提前一步执行🎜🎜 🎜。🎜🎜. means

main.go
imported

lain

lainpakej diimport

dalamanAjar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

beg, anak patung bersarang.

Mari kita lihat keputusan pelaksanaan dahulumain.go导入了otherother包导入了inner

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

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

方法先执行然后是ohter

Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go

init🎜🎜方法。🎜🎜

🎜其实本质是碰到🎜🎜 import🎜🎜就执行被导入包的被导入包🎜🎜init🎜🎜方法。🎜🎜 🎜🎜它的图应该是这样子的。🎜🎜🎜🎜🎜

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

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

那就执行
lain

的🎜🎜 init🎜🎜方法。🎜🎜🎜🎜 🎜但是在导入🎜🎜ohter🎜🎜时发现🎜🎜lain🎜🎜导入了🎜🎜dalaman🎜🎜那就执行🎜 🎜dalaman🎜🎜的🎜🎜init🎜🎜方法。🎜🎜🎜🎜🎜🎜🎜 🎜Ringkasan pakej dalam

.

Isu kebenaran pakej (semua kelihatan bermula dengan huruf besar), Import tanpa nama pakej, kaedah , pelbagai kaedah init Perhatian penting.

Atas ialah kandungan terperinci Ajar anda langkah demi langkah untuk memahami pakej dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Go语言进阶学习. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Pergi: Nota pengoptimuman mudahArtikel seterusnya:Pergi: Nota pengoptimuman mudah