

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護，並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 中使用 AWS CDK Go
<a name="work-with-cdk-go"></a>

 Go 是完全支援的 AWS 雲端開發套件 (AWS CDK) 用戶端語言，且被視為穩定。在 Go 中使用 AWS CDK 會使用熟悉的工具。Go 版本的 AWS CDK 甚至使用 Go 樣式識別符。

與 CDK 支援的其他語言不同， Go 不是傳統的物件導向程式設計語言。 Go使用其他語言通常利用繼承的合成。我們已嘗試盡可能採用栩栩如生Go的方法，但有些地方的 CDK 可能有所不同。

本主題提供在 中使用 AWS CDK 的指引Go。如需 AWS CDK 的簡單 Go 專案演練，請參閱[公告部落格文章](https://aws.amazon.com/blogs/developer/getting-started-with-the-aws-cloud-development-kit-and-go/)。

## 開始使用 Go
<a name="go-prerequisites"></a>

若要使用 AWS CDK，您必須擁有 AWS 帳戶和登入資料，並已安裝 Node.js 和 AWS CDK Toolkit。請參閱 [AWS CDK 入門](getting-started.md)。

 AWS CDK 的Go繫結使用標準 [Go 工具鏈](https://golang.org/dl/) v1.23 或更新版本。您可以使用您選擇的編輯器。

**注意**  
第三方語言棄用：只有在廠商或社群共用其 EOL （生命週期結束） 之前，才支援語言版本，且可能會有所變更，恕不另行通知。

## 建立專案
<a name="go-newproject"></a>

您可以透過`cdk init`在空目錄中叫用 來建立新的 AWS CDK 專案。使用 `--language`選項並指定 `go`：

```
mkdir my-project
cd my-project
cdk init app --language go
```

 `cdk init` 使用專案資料夾的名稱來命名專案的各種元素，包括類別、子資料夾和檔案。資料夾名稱中的連字號會轉換為底線。不過，名稱應該遵循Go識別符的形式；例如，它不應以數字開頭或包含空格。

產生的專案包含 中核心 AWS CDK Go模組 `github.com/aws/aws-cdk-go/awscdk/v2`的參考`go.mod`。安裝此和其他必要模組`go get`的問題。

## 管理 AWS 建構程式庫模組
<a name="go-managemodules"></a>

在大多數 AWS CDK 文件和範例中，「模組」一詞通常用於參考 AWS 建構程式庫模組，每個 AWS 服務一或多個模組，這與術語的慣用Go用量不同。CDK Construct Library 在一個Go模組中提供，其中包含個別的 Construct Library 模組，該模組支援各種 AWS 服務，以該模組內的Go套件形式提供。

有些服務「 AWS 建構程式庫支援位於多個建構程式庫模組 (Go 套件） 中。例如，除了名為 `awsroute53patterns`、 和 的主`awsroute53`套件之外`awsroute53resolver`，Amazon Route 53 還有三個 Construct Library 模組`awsroute53targets`。

大多數 AWS CDK 應用程式中需要的 AWS CDK 核心套件會在Go程式碼中匯入為 `github.com/aws/aws-cdk-go/awscdk/v2`。 AWS Construct Library 中各種服務的套件會在 下上線`github.com/aws/aws-cdk-go/awscdk/v2`。例如，Amazon S3 模組的命名空間為 `github.com/aws/aws-cdk-go/awscdk/v2/awss3`。

```
import (
        "github.com/aws/aws-cdk-go/awscdk/v2/awss3"
        // ...
)
```

匯入您要在應用程式中使用之服務的建構程式庫模組 (Go 套件） 之後，您可以使用 存取該模組中的建構模組`awss3.Bucket`。

## 在 中管理相依性 Go
<a name="work-with-cdk-go-dependencies"></a>

在 中Go，相依性版本在 中定義`go.mod`。預設值`go.mod`類似於此處所示的預設值。

```
module my-package

go 1.16

require (
  github.com/aws/aws-cdk-go/awscdk/v2 v2.16.0
  github.com/aws/constructs-go/constructs/v10 v10.0.5
  github.com/aws/jsii-runtime-go v1.29.0
)
```

套件名稱 （模組，在 Go parlance 中） 是由附加必要版本編號的 URL 指定。 Go的模組系統不支援版本範圍。

發出 `go get`命令來安裝所有必要的模組並更新 `go.mod`。若要查看您相依性的可用更新清單，請發出 `go list -m -u all`。

## AWS 中的 CDK 慣用詞 Go
<a name="go-cdk-idioms"></a>

### 欄位和方法名稱
<a name="go-naming"></a>

欄位和方法名稱使用 TypeScript 中的駝毛大小寫 (`likeThis`)，也就是 CDK 的原始語言。在 中Go，這些遵循Go慣例，因此 Pascal 大小寫 (`LikeThis`)。

### 清除
<a name="go-cdk-jsii-close"></a>

在您的`main`方法中，使用 `defer jsii.Close()`來確保您的 CDK 應用程式在其本身之後清除。

### 遺失值和指標轉換
<a name="go-missing-values"></a>

在 中Go，缺少屬性套件等 AWS CDK 物件中的值會以 表示`nil`。 Go 沒有 null 的類型；唯一可以包含的類型`nil`是指標。若要允許值為選用，則所有 CDK 屬性、引數和傳回值都是指標，即使是基本類型也是如此。這適用於所需值和選用值，因此，如果稍後所需的值變成選用值，則不需要對類型進行重大變更。

傳遞常值或表達式時，請使用下列協助程式函數來建立值的指標。
+  `jsii.String` 
+  `jsii.Number` 
+  `jsii.Bool` 
+  `jsii.Time` 

為保持一致性，我們建議您在定義自己的建構模組時以類似方式使用指標，例如，接收建構的`id`字串而非字串的指標似乎更方便。

處理選用 AWS 的 CDK 值時，包括基本值和複雜類型，您應該明確測試指標，以確保它們不在對它們執行任何操作`nil`之前。Go 沒有幫助處理空值或遺失值的「語法糖」，就像某些其他語言一樣。不過，屬性套件和類似結構中的必要值保證存在 （否則建構失敗），因此不需要 `nil`檢查這些值。

### 建構和道具
<a name="go-props"></a>

代表一或多個 AWS 資源及其相關聯屬性的 建構會在 中表示Go為介面。例如， `awss3.Bucket` 是 界面。每個建構都有原廠函數，例如 `awss3.NewBucket`，以傳回實作對應界面的結構。

所有工廠函數都採用三個引數：定義`scope`建構的 （建構樹狀結構中的父系）`id`、 和 `props`，以及建構結構用來設定其建立之資源的金鑰/值對套件。 AWS CDK 中的其他位置也會使用「屬性組合」模式。

在 中Go，props 是以每個建構的特定結構類型表示。例如， `awss3.Bucket`採用類型為 的 props 引數`awss3.BucketProps`。使用結構常值來寫入 props 引數。

```
var bucket = awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
    Versioned: jsii.Bool(true),
})
```

### 一般結構
<a name="go-generic-structures"></a>

在某些地方， AWS CDK 會使用 JavaScript 陣列或未輸入物件做為方法的輸入。（例如，請參閱 AWS CodeBuild 的 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue)方法。) 在 Go 中，這些物件分別以配量和空界面表示。

CDK 提供變數協助程式函數，例如`jsii.Strings`用於建置包含基本類型的配量。

```
jsii.Strings("One", "Two", "Three")
```

### 使用任何配量
<a name="go-any-slice"></a>

某些建構需要屬於多種類型 (TypeScript 中的聯合類型） 清單的屬性。在 中Go，這些是任何 () 的配量`*[]any`。`any` 可確保編譯器允許在那裡指派不同類型的 。請參閱 文件` [AWS CDK Go package](https://pkg.go.dev/github.com/aws/aws-cdk-go/awscdk/v2) `以了解允許類型為何。

若要使用這類屬性，請使用 提供的協助程式函數`jsii`，從不同類型建立任何 的配量：
+  `jsii.AnySlice` 
+  `jsii.AnyStrings` 
+  `jsii.AnyNumbers` 

例如：

```
func Arns() *[]*string {
a := "arn:aws:s3:::bucket1"
b := "arn:aws:s3:::bucket2"
return &[]*string{&a, &b}
}

awsiam.NewCfnUser(stack, jsii.String("User"), &awsiam.CfnUserProps{
	ManagedPolicyArns: jsii.AnySlice(Arns())
  // or
	ManagedPolicyArns: jsii.AnyStrings("arn:aws:s3:::bucket1", "arn:aws:s3:::bucket2")
  // or
  ManagedPolicyArns: &[]interface{}{
    jsii.String("arn:aws:s3:::bucket1"),
    jsii.String("arn:aws:s3:::bucket2"),
  }
})
```

此方法可確保您的配量由 CDK 正確解譯，避免在部署或合成堆疊時發生還原序列化錯誤。

### 開發自訂建構
<a name="go-writing-constructs"></a>

在 中Go，撰寫新的建構通常比延伸現有的建構更簡單。首先，定義新的結構類型，如果需要類似延伸的語意，則匿名嵌入一或多個現有類型。您新增的任何新功能的寫入方法，以及保留其所需資料所需的欄位。如果您的建構需要，請定義道具界面。最後，撰寫原廠函數`NewMyConstruct()`以傳回 建構的執行個體。

如果您只是變更現有建構上的一些預設值，或在執行個體化時新增簡單行為，則不需要所有該管道。相反地，請撰寫工廠函數來呼叫您「延伸」之建構的工廠函數。例如，在其他 CDK 語言中，您可以建立 `TypedBucket`建構，透過覆寫 類型來強制執行 Amazon S3 儲存貯體中的物件`s3.Bucket`類型，並在新類型的初始化器中新增僅允許將指定檔案名稱副檔名新增至儲存貯體的儲存貯體政策。在 中Go，只需撰寫 `NewTypedBucket`，即可傳回已新增適當儲存貯體政策的 `s3.Bucket`（使用 建立`s3.NewBucket`)。不需要新的建構類型，因為功能已在標準儲存貯體建構中可用；新的「建構」提供更簡單的設定方式。

## 建置、合成和部署
<a name="go-running"></a>

 AWS CDK 會在執行應用程式之前自動編譯應用程式。不過，手動建置您的應用程式以檢查錯誤和執行測試會很有用。您可以在專案根目錄中，`go build`於命令提示字元發出 來執行此操作。

在命令提示`go test`中執行 ，以執行您撰寫的任何測試。

## 疑難排解
<a name="go-troubleshooting"></a>

如果您遇到如下所示的編譯器錯誤，表示字串配量直接傳遞至預期配量為任何的屬性。

```
Cannot use 'jsii.Strings("arn:aws:s3:::bucket1", "arn:aws:s3:::bucket2")' (type *[]*string) as the type *[]interface{}
```

若要解決此錯誤，請將 取代`jsii.Strings()`為 `jsii.AnyStrings()`。如需更多內容和其他解決方案` [CDK GitHub issue](https://github.com/aws/aws-cdk/issues/35630) `，請參閱此處。