ホームページ  >  記事  >  バックエンド開発  >  Go 言語のパッケージを理解するためのステップバイステップの指導

Go 言語のパッケージを理解するためのステップバイステップの指導

Go语言进阶学习
Go语言进阶学习転載
2023-07-21 13:07:131397ブラウズ

##Package

Package は、複数の を格納するものとして理解できます。 go フォルダーですが、このフォルダーの最初の行の #package の後に # が付きません。 ##main はファイル名で、 のようになります。

#目次

Go 言語のパッケージを理解するためのステップバイステップの指導

#clac

これは、main.go ファイルと同じレベルです。

add.goclac フォルダー # にあります。 ##最初の行は main ではなく、フォルダー名 clac になりました。同様にsub.go最初の行も同様です。

これは、パッケージの定義方法についての個別の説明にすぎず、実際的な意味はありません。


#パッケージに関する注意事項

このフォルダーを次のように使用する場合パッケージ フォルダー名に

# を含めることはできません。


パッケージのインポート

上記で、パッケージがどのように定義されているかがわかりました。

そして、プロジェクト ディレクトリに main.go と同じレベルに ## を作成しました。 #clac パッケージ。

clac パッケージの下には 2 つのファイルがあります。1 つは です。 add .go1 つは #sub.go2 つのフォルダーには対応するメソッドがあります。 質問が来ていますか? ? ?

では、上で作成したパッケージを使用して main.go のメソッドを呼び出すにはどうすればよいでしょうか?

#これはそれらをインポートするためのものです。

サンプルコード

#
package main


import (
   "a3_course/clac"
)


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

#実行結果

Go 言語のパッケージを理解するためのステップバイステップの指導

##で確認できます。

clac パッケージ内のコードが ##main.go で正常に呼び出されました。

#注:


インポート パッケージはフォルダーにインポートするだけで済みます。以下のすべてのメソッドとプロパティを呼び出す場合、

package name.xx.go メソッドは必要なくなりました。 #上記のようにインポート#calc#問題なし

#calc#.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 言語のパッケージを理解するためのステップバイステップの指導

パッケージを匿名でインポートしましたが、依然として add.go## を実行していることがわかります。 # sub.goinit メソッド。

これは問題を示しています。パッケージをインポートすると、すべての init メソッドが実行されます。メソッドは重要ではありません。以下に .go ファイルがいくつあるかを確認します。

注: #init メソッドパッケージを作成できない パラメータに戻り値を含めることはできません initメソッドはインポート中にのみ呼び出すことができ、アクティブに呼び出すことはできません。

##initメソッド比率mainメソッドは 1 ステップ先に実行されます


#複数のパッケージがネストされてインポ​​ートされる場合の init メソッドの実行順序

Ifさらにコードがあります。直接アクセスしてください。図に示すように:

Go 言語のパッケージを理解するためのステップバイステップの指導

これは、main.go## を意味します。 #インポートされたotherパッケージotherインポートされたパッケージinner バッグ、入れ子人形。

まずは実行結果を見てみましょう

実行結果は innerinit メソッドファーストです実行の後に、ohterinit メソッドが続きます。

#実際、本質は、import## が発生したときに、インポートされたパッケージの ## を実行することです。 ##init メソッド。 #画像は次のようになります。

は、main インポートされた ohter を意味し、# を実行します。 ##otherinit メソッド。

しかし、ohter をインポートすると、other が見つかりました。 インポートされたinner次に実行##inner init メソッド。


#概要

以上で、Go の基本的なパッケージとパッケージの作成方法について学びました。# #、組織パッケージパッケージのインポートに関する注意事項#パッケージの権限の問題 (すべて大文字で始まる表示)#,#匿名インポート パッケージ , init メソッド,複数の init メソッド注意事項。

以上がGo 言語のパッケージを理解するためのステップバイステップの指導の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。