Go SDK
安裝並設定 Anthropic Go SDK,支援基於 context 的取消機制與函式選項
Anthropic Go 函式庫讓以 Go 撰寫的應用程式能夠便利地存取 Claude API。
安裝
import (
"github.com/anthropics/anthropic-sdk-go" // imported as anthropic
)使用 go get 安裝:
go get github.com/anthropics/anthropic-sdk-go需求
此函式庫需要 Go 1.24 以上版本。
使用方式
package main
import (
"context"
"fmt"
"github.com/anthropics/anthropic-sdk-go"
"github.com/anthropics/anthropic-sdk-go/option"
)
func main() {
client := anthropic.NewClient(
option.WithAPIKey("my-anthropic-api-key"), // defaults to os.LookupEnv("ANTHROPIC_API_KEY")
)
message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("What is a quaternion?")),
},
Model: anthropic.ModelClaudeOpus5_5,
})
if err != nil {
panic(err.Error())
}
for _, block := range message.Content {
if textBlock, ok := block.AsAny().(anthropic.TextBlock); ok {
fmt.Println(textBlock.Text)
}
}
}如需包括「Workload Identity Federation」(工作負載身分聯合)在內的驗證選項,請參閱驗證。如果您的 API 金鑰是未限定於某個工作區的個人或服務帳戶金鑰,請在 anthropic-workspace-id 請求標頭中設定工作區 ID;選擇工作區說明了此 SDK 的逐請求設定選項。
messages := []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("What is my first name?")),
}
message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
Messages: messages,
MaxTokens: 1024,
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", message.Content)
messages = append(messages, message.ToParam())
messages = append(messages, anthropic.NewUserMessage(
anthropic.NewTextBlock("My full name is John Doe"),
))
message, err = client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
Messages: messages,
MaxTokens: 1024,
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", message.Content)message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
System: []anthropic.TextBlockParam{
{Text: "Be very serious at all times."},
},
Messages: messages,
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", message.Content)content := "What is a quaternion?"
stream := client.Messages.NewStreaming(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock(content)),
},
})
message := anthropic.Message{}
for stream.Next() {
event := stream.Current()
err := message.Accumulate(event)
if err != nil {
panic(err)
}
switch eventVariant := event.AsAny().(type) {
case anthropic.ContentBlockDeltaEvent:
switch deltaVariant := eventVariant.Delta.AsAny().(type) {
case anthropic.TextDelta:
print(deltaVariant.Text)
}
}
}
if stream.Err() != nil {
panic(stream.Err())
}messages := []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock(content)),
}
toolParams := []anthropic.ToolParam{
{
Name: "get_coordinates",
Description: anthropic.String("Accepts a place as an address, then returns the latitude and longitude coordinates."),
InputSchema: GetCoordinatesInputSchema,
},
}
tools := make([]anthropic.ToolUnionParam, len(toolParams))
for i, toolParam := range toolParams {
tools[i] = anthropic.ToolUnionParam{OfTool: &toolParam}
}
for {
message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: messages,
Tools: tools,
})
if err != nil {
panic(err)
}
print(color("[assistant]: "))
for _, block := range message.Content {
switch block := block.AsAny().(type) {
case anthropic.TextBlock:
println(block.Text)
println()
case anthropic.ToolUseBlock:
inputJSON, _ := json.Marshal(block.Input)
println(block.Name + ": " + string(inputJSON))
println()
}
}
messages = append(messages, message.ToParam())
toolResults := []anthropic.ContentBlockParamUnion{}
for _, block := range message.Content {
switch variant := block.AsAny().(type) {
case anthropic.ToolUseBlock:
print(color("[user (" + block.Name + ")]: "))
var response interface{}
switch block.Name {
case "get_coordinates":
var input struct {
Location string `json:"location"`
}
err := json.Unmarshal([]byte(variant.JSON.Input.Raw()), &input)
if err != nil {
panic(err)
}
response = GetCoordinates(input.Location)
}
b, err := json.Marshal(response)
if err != nil {
panic(err)
}
println(string(b))
toolResults = append(toolResults, anthropic.NewToolResultBlock(block.ID, string(b), false))
}
}
if len(toolResults) == 0 {
break
}
messages = append(messages, anthropic.NewUserMessage(toolResults...))
}請求欄位
Anthropic 函式庫對請求欄位採用 Go 1.24+ encoding/json 版本中的 omitzero
語意。
必要的基本型別欄位(例如 int64 或 string)帶有標籤 `json:"...,required"`。這些
欄位一律會被序列化,即使是零值也一樣。
選用的基本型別會被包裝在 param.Opt[T] 中。這些欄位可以使用提供的建構函式來設定,例如 anthropic.String(string) 或 anthropic.Int(int64)。
任何 param.Opt[T]、map、slice、struct 或字串列舉都使用
標籤 `json:"...,omitzero"`。其零值會被視為省略。
param.IsOmitted(any) 函式可以確認任何 omitzero 欄位是否存在。
p := anthropic.ExampleParams{
ID: "id_xxx", // required property
Name: anthropic.String("..."), // optional property
Point: anthropic.Point{
X: 0, // required field will serialize as 0
Y: anthropic.Int(1), // optional field will serialize as 1
// ... 省略的非必要欄位將不會被序列化
},
Origin: anthropic.Origin{}, // the zero value of [Origin] is considered omitted
}若要傳送 null 而非 param.Opt[T],請使用 param.Null[T]()。
若要傳送 null 而非 struct T,請使用 param.NullStruct[T]()。
p.Name = param.Null[string]() // 'null' instead of string
p.Point = param.NullStruct[Point]() // 'null' instead of struct
param.IsNull(p.Name) // true
param.IsNull(p.Point) // true請求 struct 包含 .SetExtraFields(map[string]any) 方法,可在請求主體中傳送不符合規格的
欄位。額外欄位會覆寫任何具有相同
鍵的 struct 欄位。
若要傳送自訂值而非 struct,請使用泛型函式 param.Override(例如 param.Override[anthropic.FooParams](12))。
// 若 API 指定了某個型別,
// 但您想傳送其他內容,請使用 [SetExtraFields]:
p.SetExtraFields(map[string]any{
"x": 0.01, // send "x" as a float instead of int
})
// 傳送數字而非物件
custom := param.Override[anthropic.FooParams](12)請求聯集
「Union」(聯集)以 struct 表示,其每個變體各對應一個以「Of」為前綴的欄位。 只能有一個欄位為非零值。非零值的欄位會被序列化。
聯集的子屬性可以透過聯集 struct 上的方法存取。 這些方法會回傳指向該值的指標(若存在)。
// 只能有一個欄位為非零值,請使用 param.IsOmitted() 檢查欄位是否已設定
type AnimalUnionParam struct {
OfCat *Cat `json:",omitzero,inline"`
OfDog *Dog `json:",omitzero,inline"`
}
animal := AnimalUnionParam{
OfCat: &Cat{
Name: "Whiskers",
Owner: PersonParam{
Address: AddressParam{Street: "3333 Coyote Hill Rd", ZipCode: 0},
},
},
}
// 修改欄位
if address := animal.GetOwner().GetAddress(); address != nil {
address.ZipCode = 94304
}反序列化參數
參數型別(以 Param 結尾的型別,例如 MessageNewParams 或 ToolUnionParam)僅設計用於傳出的請求。它們可以正確地序列化為 JSON,但不完全支援往返反序列化。如果您將原始 JSON 反序列化到參數 struct 中,即使底層 JSON 有效,像 OfBashTool20250124 這樣的具型別聯集欄位仍會是 nil。
如果您需要從原始 JSON(例如來自資料庫、中介軟體或先前的請求)重建參數,請呼叫 UnmarshalJSON 來填入非聯集欄位,然後使用 param.SetJSON 附加原始位元組,以便正確地重新序列化:
// 序列化 params(例如用於儲存或轉送)
b, err := json.Marshal(original)
if err != nil {
panic(err)
}
// 稍後,從已儲存的 JSON 重建 params
var params anthropic.MessageNewParams
if err := params.UnmarshalJSON(b); err != nil {
panic(err)
}
param.SetJSON(b, ¶ms)
// params.Model 及其他純量欄位會由 UnmarshalJSON 填入。
// params.Tools[0].OfBashTool20250124 為 nil(union 的限制),
// 但原始 JSON 會被保留。當 params 再次被 marshal
// 以進行 API 呼叫時,tools 會正確序列化。
b2, _ := json.Marshal(params)
fmt.Println(string(b) == string(b2)) // true在此使用情境中,建議使用 param.SetJSON(自 v1.20.0 起提供),而非較通用的 param.Override[T](any),因為它不需要明確寫出型別參數,並且能清楚表達往返的意圖。
回應物件
回應 struct 中的所有欄位都是一般的值型別(而非指標或包裝器)。
回應 struct 也包含一個特殊的 JSON 欄位,其中含有關於
每個屬性的中繼資料。
type Animal struct {
Name string `json:"name,nullable"`
Owners int `json:"owners"`
Age int `json:"age"`
JSON struct {
Name respjson.Field
Owners respjson.Field
Age respjson.Field
ExtraFields map[string]respjson.Field
} `json:"-"`
}若要處理選用資料,請在 JSON 欄位上使用 .Valid() 方法。
當欄位存在、非 null 且已成功反序列化時,.Valid() 會回傳 true。
如果 .Valid() 為 false,對應的欄位將會是其零值。
raw := `{"owners": 1, "name": null}`
var res Animal
json.Unmarshal([]byte(raw), &res)
// 存取一般欄位
res.Owners // 1
res.Name // ""
res.Age // 0
// 選用欄位檢查
res.JSON.Owners.Valid() // true
res.JSON.Name.Valid() // false
res.JSON.Age.Valid() // false
// 原始 JSON 值
res.JSON.Owners.Raw() // "1"
res.JSON.Name.Raw() == "null" // true
res.JSON.Name.Raw() == respjson.Null // true
res.JSON.Age.Raw() == "" // true
res.JSON.Age.Raw() == respjson.Omitted // true這些 .JSON struct 也包含一個 ExtraFields map,其中含有
JSON 回應中未在 struct 中指定的
任何屬性。這對於 SDK 中尚未提供的
API 功能很有用。
body := res.JSON.ExtraFields["my_unexpected_field"].Raw()回應聯集
在回應中,聯集以扁平化的 struct 表示,其中包含每個
物件變體的所有可能欄位。
若要將其轉換為某個變體,請使用 .AsFooVariant() 方法,或使用 .AsAny() 方法(若存在)。
如果回應值聯集包含基本型別值,基本型別欄位會與
屬性並列,但以 Of 為前綴,並帶有標籤 json:"...,inline"。
type AnimalUnion struct {
// 來自變體 [Dog]、[Cat]
Owner Person `json:"owner"`
// 來自變體 [Dog]
DogBreed string `json:"dog_breed"`
// 來自變體 [Cat]
CatBreed string `json:"cat_breed"`
// ...
JSON struct {
Owner respjson.Field
// ...
} `json:"-"`
}
// 若為 animal 變體
if animal.Owner.Address.ZipCode == "" {
panic("missing zip code")
}
// 依變體進行 switch
switch variant := animal.AsAny().(type) {
case Dog:
case Cat:
default:
panic("unexpected type")
}錯誤處理
當 API 回傳非成功的狀態碼時,SDK 會回傳型別為
*anthropic.Error 的錯誤。其中包含請求的 StatusCode、*http.Request 和
*http.Response 值,以及錯誤主體的 JSON
(與 SDK 中的其他回應物件非常相似)。此錯誤也包含來自回應標頭的 RequestID,
這在與 Anthropic 支援團隊進行疑難排解時很有用。
若要處理錯誤,請使用 errors.As 模式:
_, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5_5,
})
if err != nil {
var apierr *anthropic.Error
if errors.As(err, &apierr) {
println("Request ID:", apierr.RequestID)
println(string(apierr.DumpRequest(true))) // Prints the serialized HTTP request
println(string(apierr.DumpResponse(true))) // Prints the serialized HTTP response
}
panic(err.Error()) // POST "/v1/messages": 400 Bad Request (Request-ID: req_xxx) { ... }
}發生其他錯誤時,它們會以未包裝的形式回傳;例如,
如果 HTTP 傳輸失敗,您可能會收到包裝了 *net.OpError 的 *url.Error。
重試
某些錯誤預設會自動重試 2 次,並採用短暫的「exponential backoff」(指數退避)。 SDK 預設會重試所有連線錯誤、408 Request Timeout、409 Conflict、429 Rate Limit, 以及 >=500 Internal 錯誤。
您可以使用 WithMaxRetries 選項來設定或停用此行為:
// 設定所有請求的預設值:
client := anthropic.NewClient(
option.WithMaxRetries(0), // default is 2
)
// 針對個別請求覆寫:
client.Messages.New(
context.TODO(),
anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5_5,
},
option.WithMaxRetries(5),
)逾時
非串流的 Messages 請求預設會在 10 分鐘後逾時;其他請求則沒有預設逾時。請使用 context 來設定請求生命週期的逾時。
請注意,如果請求被重試,context 逾時不會重新計算。
若要設定每次重試的逾時,請使用 option.WithRequestTimeout()。
// 此設定請求的逾時時間,包含所有重試。
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
client.Messages.New(
ctx,
anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5_5,
},
// 此設定每次重試的逾時時間
option.WithRequestTimeout(20*time.Second),
)長時間請求
請避免在未使用串流的情況下設定較大的 MaxTokens 值,因為某些網路可能會在一段時間後中斷閒置連線,這
可能導致請求失敗或在未收到 Anthropic 回應的情況下逾時。
如果預期非串流請求的時間會超過約 10 分鐘,此 SDK 也會回傳錯誤。
呼叫 .Messages.NewStreaming() 或設定自訂逾時可停用此錯誤。
檔案上傳
對應於 multipart 請求中檔案上傳的請求參數,其型別為
io.Reader。io.Reader 的內容預設會以 multipart 表單
部分傳送,檔案名稱為 anonymous_file,內容類型為 application/octet-stream,因此建議的做法是使用 anthropic.File(reader io.Reader, filename string, contentType string)
輔助函式指定自訂內容類型,它會以適當的檔案名稱和內容類型包裝任何 io.Reader。
// 來自檔案系統的檔案
file, err := os.Open("/path/to/file.json")
anthropic.FileUploadParams{
File: anthropic.File(file, "custom-name.json", "application/json"),
}
// 來自字串的檔案
anthropic.FileUploadParams{
File: anthropic.File(strings.NewReader("my file contents"), "custom-name.json", "application/json"),
}也可以透過在 io.Reader 的執行期型別上實作 Name() string 或 ContentType() string 來自訂檔案名稱和內容類型。請注意,os.File 實作了 Name() string,因此
由 os.Open 回傳的檔案會以磁碟上的檔案名稱傳送。
分頁
此函式庫提供了一些便利功能,用於處理分頁的列表端點。
您可以使用 .ListAutoPaging() 方法來逐一走訪所有頁面中的項目:
iter := client.Messages.Batches.ListAutoPaging(context.TODO(), anthropic.MessageBatchListParams{
Limit: anthropic.Int(20),
})
// 視需要自動擷取更多頁面。
for iter.Next() {
messageBatch := iter.Current()
fmt.Println(messageBatch.ID)
}
if err := iter.Err(); err != nil {
panic(err.Error())
}或者,您可以使用簡單的 .List() 方法來擷取單一頁面,並取得標準回應物件,
其中附有 .GetNextPage() 等額外的輔助方法:
page, err := client.Messages.Batches.List(context.TODO(), anthropic.MessageBatchListParams{
Limit: anthropic.Int(20),
})
for page != nil {
for _, batch := range page.Data {
fmt.Println(batch.ID)
}
page, err = page.GetNextPage()
}
if err != nil {
panic(err.Error())
}RequestOptions
此函式庫採用「functional options pattern」(函式選項模式)。定義於
option 套件中的函式會回傳 RequestOption,這是一個會修改
RequestConfig 的閉包。這些選項可以提供給用戶端,也可以提供給個別
請求。例如:
client := anthropic.NewClient(
// 為用戶端發出的每個請求加入標頭
option.WithHeader("X-Some-Header", "custom_header_info"),
)
client.Messages.New(context.TODO(), // ...,
// 覆寫標頭
option.WithHeader("X-Some-Header", "some_other_custom_header_info"),
// 使用 sjson 語法,在請求主體中加入未記載於文件的欄位
option.WithJSONSet("some.json.path", map[string]string{"my": "object"}),
)請求選項 option.WithDebugLog(nil) 在除錯時可能會有所幫助。
請參閱完整的請求選項列表。
HTTP 用戶端自訂
關於請求中介軟體(option.WithMiddleware)以及替換預設的 http.Client(option.WithHTTPClient),請參閱 SDK 中介軟體。
平台整合
Go SDK 支援以下平台:
- Agent Platform:
import "github.com/anthropics/anthropic-sdk-go/vertex"。使用vertex.WithGoogleAuth(ctx, region, projectID)或vertex.WithCredentials(ctx, region, projectID, creds)。 - Bedrock:
import "github.com/anthropics/anthropic-sdk-go/bedrock"。對於 Messages-API Bedrock 端點(透過 SSE 串流),請使用bedrock.NewMantleClient;或使用bedrock.WithLoadDefaultConfig(ctx)/bedrock.WithConfig(cfg)(bedrock-runtime路徑)。匯入bedrock套件會(透過套件init())在 SDK 的串流層全域註冊application/vnd.amazon.eventstream的解碼器。無論您使用bedrock-runtime的WithConfig/WithLoadDefaultConfig路徑或NewMantleClient,此行為皆適用。 - Claude Platform on AWS:
import anthropicaws "github.com/anthropics/anthropic-sdk-go/aws"。使用anthropicaws.NewClient(ctx, cfg)搭配anthropicaws.ClientConfig值來建構用戶端;在設定中設定WorkspaceID,或設定ANTHROPIC_AWS_WORKSPACE_ID環境變數。anthropicaws匯入別名可避免在同時匯入github.com/aws/aws-sdk-go-v2/aws時發生名稱衝突。目前以 beta 形式提供。 - Foundry:
import "github.com/anthropics/anthropic-sdk-go/foundry"。使用foundry.NewClient(cfg)搭配foundry.ClientConfig值來建構用戶端;在設定中設定APIKey(或針對 Microsoft Entra ID 使用AzureADTokenProvider)和Resource,或設定ANTHROPIC_FOUNDRY_API_KEY和ANTHROPIC_FOUNDRY_RESOURCE環境變數。
新專案請使用 bedrock.NewMantleClient;bedrock.WithLoadDefaultConfig/WithConfig 則保留給使用 Bedrock InvokeModel API 的現有應用程式。
Go SDK 也透過 github.com/anthropics/anthropic-sdk-go/googlecloud 套件支援 Claude Models on Google Cloud (Anthropic managed)。若要建構用戶端,請使用 googlecloud.ClientConfig 值呼叫 googlecloud.NewClient(ctx, cfg)。此用戶端目前為 beta 版。請在設定中設定 WorkspaceID,或設定 ANTHROPIC_GOOGLE_CLOUD_WORKSPACE_ID 環境變數。請參閱專案、位置與工作區解析,以了解用戶端如何解析工作區 ID。
進階用法
存取原始回應資料(例如回應標頭)
您可以使用 option.WithResponseInto() 請求選項來存取原始 HTTP 回應資料。當
您需要檢查回應標頭、狀態碼或其他詳細資訊時,這會很有用。
// 建立一個變數來儲存 HTTP 回應
var response *http.Response
message, err := client.Messages.New(
context.TODO(),
anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5_5,
},
option.WithResponseInto(&response),
)
if err != nil {
// 處理錯誤
}
fmt.Printf("%+v\n", message.Content)
fmt.Printf("Status Code: %d\n", response.StatusCode)
fmt.Printf("Headers: %+#v\n", response.Header)OpenTelemetry 追蹤
當您的應用程式註冊 OpenTelemetry tracer provider 時,SDK 會為其傳送的每個請求發出一個 span。若要將這些 span 傳送至您的可觀測性平台,請參閱搭配 Claude SDK 設定 OpenTelemetry。
發送自訂/未記載的請求
此函式庫具有型別定義,以便於存取已記載的 API。如果您需要存取未記載的 端點、參數或回應屬性,仍然可以使用此函式庫。
未記載的端點
若要向未記載的端點發送請求,您可以使用 client.Get、client.Post 及其他 HTTP 動詞。
發送這些請求時,用戶端上的 RequestOptions(例如重試)會被遵循。
var (
// params 可以是 io.Reader、[]byte、可由 encoding/json 序列化的物件,
// 或本函式庫中定義的「...Params」結構。
params map[string]any
// result 可以是 []byte、*http.Response、可由 encoding/json 反序列化的物件,
// 或本函式庫中定義的模型。
result *http.Response
)
err := client.Post(context.Background(), "/unspecified", params, &result)
if err != nil {
// ...
}未記載的請求參數
若要使用未記載的參數發送請求,您可以使用 option.WithQuerySet()
或 option.WithJSONSet() 方法。
params := FooNewParams{
ID: "id_xxxx",
Data: FooNewParamsData{
FirstName: anthropic.String("John"),
},
}
client.Foo.New(context.Background(), params, option.WithJSONSet("data.last_name", "Doe"))未記載的回應屬性
若要存取未記載的回應屬性,您可以使用 result.JSON.RawJSON() 以字串形式存取回應的原始 JSON,
或使用 result.JSON.Foo.Raw() 取得結果中特定欄位的原始 JSON。
任何不存在於回應 struct 中的欄位都會被保存,並可透過 result.JSON.ExtraFields 存取,其型別為 map[string]respjson.Field。
語意化版本
此 SDK 的每個主要版本預設會在 anthropic-version 標頭中傳送一個 API 版本,且每個新的 API 版本都會伴隨一個新的主要版本。第一個傳送 2026-10-21 的主要版本是 2.0.0,其模組路徑為 github.com/anthropics/anthropic-sdk-go/v2;請參閱遷移至 API 版本 2026-10-21。
此套件大致遵循 SemVer 慣例,但某些不向下相容的變更可能會以次要版本發布:
- 對函式庫內部的變更,這些內部在技術上是公開的,但並非預期或記載供外部使用。
- 預期在實務上不會影響絕大多數使用者的變更。
我們非常重視向下相容性,以確保您能享有順暢的升級體驗。
歡迎您提供意見回饋;如有問題、錯誤或建議,請開立 issue。
其他資源
Was this page helpful?