>백엔드 개발 >Golang >Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-21 13:07:131403검색

패키지

패키지는 여러 개의 .go.go的文件夹但是这个文件夹下面的第一行的package后面跟的不再是main了而是文件名,就像这样。

目录

Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

clacmain.go 폴더이지만 이 폴더 아래의 첫 번째 줄 package

🎜 뒤에는 더 이상 🎜🎜main🎜🎜하지만 파일 이름은🎜이렇습니다. 🎜

🎜목차🎜

Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.🎜🎜

🎜 clac🎜🎜and🎜🎜main.go🎜🎜파일의 레벨이 동일합니다 . 🎜🎜

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

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


包的注意事项

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

第一行不再是
메인

而是文件夹name 🎜🎜clac 🎜🎜동리🎜🎜sub.go 🎜🎜第一行也是。🎜🎜

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

🎜🎜🎜🎜

🎜包的注意事项🎜

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

패키지 가져오기

위에서 우리는 패키지가 어떻게 정의되는지 알고 있습니다.

그리고 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

패키지.

clac패키지에는 두 개의 파일이 있는데, 하나는

add.go🎜🎜One은🎜🎜 sub.go🎜🎜두 폴더 모두 있습니다. 해당 방법입니다. 🎜질문이 있으신가요? ? ? 🎜

🎜그럼 어떻게 할까요 🎜🎜main.go🎜🎜 위에서 만든 패키지를 사용하여 호출합니다. 방법은 어떻습니까? 🎜🎜🎜🎜수입에 관한 내용입니다. 🎜🎜🎜🎜🎜샘플 코드🎜🎜🎜

package main


import (
   "a3_course/clac"
)


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

执行结果

Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

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


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

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

包中的代码。

🎜

注:🎜🎜导入包只需要导入到文件夹即可就可以调用下面所有的方法과属不再需要🎜🎜包name.xx.go🎜🎜这种方式。🎜🎜🎜🎜如上述导入🎜🎜계산 코드>🎜🎜不管🎜🎜<code style="font-family: var(--monospace);vertical-align: 초기;border-width: 1px;border-style: solid;border-color: rgb(231, 234 , 237);배경색: rgb(243, 244, 244);테두리 반경: 3px;패딩 오른쪽: 2px;패딩 왼쪽: 2px;글꼴 크기: 0.9em;">계산🎜 🎜하면 유几个🎜🎜.go 🎜🎜文件里면적방법과属성도시可以随便调사용.🎜🎜🎜🎜🎜🎜🎜

导入包注意事项

上述我是直接通过

import (
   "a3_course/clac"
)

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

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

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
}

访问私有变量报错信息。

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

执行结果

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

执行结果

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() {


}

执行结果

Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

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

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

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

init方法比mainsub.go下的초기화

🎜방법。🎜
🎜

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

注:🎜🎜🎜包的🎜🎜초기화🎜🎜방법不能写参数也不能有返回值🎜🎜초기화🎜🎜방법只能재导入时调用不能主动调用。🎜🎜

🎜 init🎜🎜方法比🎜🎜main🎜🎜方法更提前一步执行🎜🎜🎜 🎜。🎜🎜


여러 패키지를 중첩하여 임포트할 때 init 메소드가 실행되는 순서

코드가 더 있으면 바로 그림과 같습니다.

Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

이것 의미main.go

main.go导入了otherother包导入了inner가져옴 기타

기타

패키지를 가져옴Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

내부🎜🎜가방, 중첩 인형. 🎜🎜🎜🎜먼저 실행 결과를 살펴보겠습니다🎜🎜🎜🎜🎜

执行结果是내부innerinit方法先执行然后是ohterinit方法。

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

방법법先执行然后是다른

Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.

초기화🎜🎜방법。🎜🎜

🎜其实本质是碰到🎜🎜 가져오기🎜🎜就执行被导入包的🎜🎜초기화🎜🎜방법。🎜🎜 🎜🎜它的图应该是这样子的。🎜🎜🎜🎜🎜

意思是메인main导入了ohter那就执行otherinit方法。

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

那就执行
기타

的🎜🎜 초기화🎜🎜방법。🎜🎜🎜🎜 🎜但是현재导入🎜🎜다른🎜🎜时发现🎜🎜기타🎜🎜导入了🎜🎜내부🎜🎜那就执行🎜 🎜내부🎜🎜的🎜🎜초기화🎜🎜방법。🎜🎜🎜🎜🎜🎜 🎜

Summary

위에서 Go의 기본 패키지, 패키지 생성 , 패키지 구성 , 패키지 가져오기 주의 사항 을 배웠습니다. . 패키지 권한 문제(모두 대문자로 시작하여 표시됨), 패키지 익명 가져오기, init 메서드, 다중 init 메서드 주의가 중요합니다.

위 내용은 Go 언어 패키지를 이해하는 방법을 단계별로 가르칩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제