全部產品
Search
文件中心

Object Storage Service:Go設定對象標籤

更新時間:Jun 19, 2024

OSS支援使用對象標籤(Object Tagging)對儲存空間(Bucket)中的檔案(Object)進行分類,您可以針對相同標籤的Object設定生命週期規則、存取權限等。

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見訪問網域名稱和資料中心

  • 本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證

  • 本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化

  • 要設定對象標籤,您必須具有oss:PutObjectTagging許可權。具體操作,請參見為RAM使用者授權自訂的權限原則

上傳Object時添加對象標籤

  • 簡單上傳時添加對象標籤

    以下代碼用於簡單上傳時添加對象標籤。

    package main
    
    import (
    	"fmt"
    	"os"
    	"strings"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 建立OSSClient執行個體。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    	// 填寫Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如exampledir/exampleobject.txt。
    	objectName := "exampledir/exampleobject.txt"
    
    	// 擷取儲存空間。
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
    	tag1 := oss.Tag{
    		Key:   "owner",
    		Value: "John",
    	}
    	tag2 := oss.Tag{
    		Key:   "type",
    		Value: "document",
    	}
    	tagging := oss.Tagging{
    		Tags: []oss.Tag{tag1, tag2},
    	}
    
    	// 設定對象標籤。
    	err = bucket.PutObject(objectName, strings.NewReader("Hello OSS"), oss.SetTagging(tagging))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Println(bucket.GetObjectTagging(objectName))
    }
    
  • 分區上傳時添加對象標籤

    以下代碼用於分區上傳本地檔案時添加對象標籤。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 建立OSSClient執行個體。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    	// 填寫Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如exampledir/exampleobject.txt。
    	objectName := "exampledir/exampleobject.txt"
    	// 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。
    	// 如果未指定本地路徑只填寫了檔案名稱(例如examplefile.txt),則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
    	fileName := "D:\\localpath\\examplefile.txt"
    
    	// 擷取儲存空間。
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
    	tag1 := oss.Tag{
    		Key:   "owner",
    		Value: "John",
    	}
    	tag2 := oss.Tag{
    		Key:   "type",
    		Value: "document",
    	}
    	tagging := oss.Tagging{
    		Tags: []oss.Tag{tag1, tag2},
    	}
    
    	// 將檔案分成3個分區進行上傳,具體分區數請根據檔案大小確定。
    	chunks, err := oss.SplitFileByPartNum(fileName, 3)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 開啟檔案。
    	fd, err := os.Open(fileName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	defer fd.Close()
    
    	// 初始化上傳的檔案,並設定對象標籤。
    	imur, err := bucket.InitiateMultipartUpload(objectName, oss.SetTagging(tagging))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 分區上傳。
    	var parts []oss.UploadPart
    	for _, chunk := range chunks {
    		fd.Seek(chunk.Offset, os.SEEK_SET)
    		part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
    		if err != nil {
    			fmt.Println("Error:", err)
    			os.Exit(-1)
    		}
    		parts = append(parts, part)
    	}
    	_, err = bucket.CompleteMultipartUpload(imur, parts)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Println(bucket.GetObjectTagging(objectName))
    }
  • 追加上傳時添加對象標籤

    以下代碼用於追加上傳時添加對象標籤。

    package main
    
    import (
    	"fmt"
    	"os"
    	"strings"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 建立OSSClient執行個體。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    	// 填寫Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如exampledir/exampleobject.txt。
    	objectName := "exampledir/exampleobject.txt"
    
    	// 擷取儲存空間。
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
    	tag1 := oss.Tag{
    		Key:   "owner",
    		Value: "John",
    	}
    	tag2 := oss.Tag{
    		Key:   "type",
    		Value: "document",
    	}
    	tagging := oss.Tagging{
    		Tags: []oss.Tag{tag1, tag2},
    	}
    
    	var nextPos int64
    	// 第一次上傳可追加的檔案。只有第一次調用AppendObject時設定的標籤才會生效,後續再調用AppendObject設定的標籤不生效。
    	nextPos, err = bucket.AppendObject(objectName, strings.NewReader("Hello OSS A \n"), nextPos, oss.SetTagging(tagging))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 第二次上傳。
    	nextPos, err = bucket.AppendObject(objectName, strings.NewReader("Hello OSS B \n"), nextPos)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Println(bucket.GetObjectTagging(objectName))
    }
  • 斷點續傳上傳時添加對象標籤

    以下代碼用於斷點續傳上傳本地檔案時添加對象標籤。

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 建立OSSClient執行個體。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    	// 填寫Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如exampledir/exampleobject.txt。
    	objectName := "exampledir/exampleobject.txt"
    	// 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。
    	// 如果未指定本地路徑只填寫了檔案名稱(例如examplefile.txt),則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
    	fileName := "D:\\localpath\\examplefile.txt"
    
    	// 擷取儲存空間。
    	bucket, err := client.Bucket(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
    	tag1 := oss.Tag{
    		Key:   "owner",
    		Value: "John",
    	}
    	tag2 := oss.Tag{
    		Key:   "type",
    		Value: "document",
    	}
    	tagging := oss.Tagging{
    		Tags: []oss.Tag{tag1, tag2},
    	}
    
    	// 將檔案分成多個分區,每個分區大小為100 KB,使用3個協程並發上傳分區,上傳時設定對象標籤。
    	err = bucket.UploadFile(objectName, fileName, 100*1024, oss.Routines(3), oss.SetTagging(tagging))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Println(bucket.GetObjectTagging(objectName))
    }
    

對已上傳Object添加或更改對象標籤

如果上傳Object時未添加對象標籤或者添加的對象標籤不滿足使用需求,您可以在上傳Object後為Object添加或更改對象標籤。

以下代碼用於對已上傳Object添加或更改對象標籤。

package main

import (
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 建立OSSClient執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 填寫Bucket名稱,例如examplebucket。
	bucketName := "examplebucket"
	// 填寫Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如exampledir/exampleobject.txt。
	objectName := "exampledir/exampleobject.txt"

	// 擷取儲存空間。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
	tag1 := oss.Tag{
		Key:   "owner",
		Value: "John",
	}
	tag2 := oss.Tag{
		Key:   "type",
		Value: "document",
	}
	tagging := oss.Tagging{
		Tags: []oss.Tag{tag1, tag2},
	}
	// 設定對象標籤。
	err = bucket.PutObjectTagging(objectName, tagging)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println(bucket.GetObjectTagging(objectName))
}

為Object指定版本添加或更改對象標籤

在已開啟版本控制的Bucket中,通過指定Object的版本ID(versionId),您可以為Object指定版本添加或更改對象標籤。

以下代碼用於為Object指定版本添加或更改對象標籤。

說明

關於擷取versionId的具體操作,請參見列舉檔案

package main

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)

func HandleError(err error) {
	fmt.Println("Error:", err)
	os.Exit(-1)
}

func main() {
	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 建立OSSClient執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 填寫Bucket名稱,例如examplebucket。
	bucketName := "examplebucket"
	// 填寫Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如exampledir/exampleobject.txt。
	objectName := "exampledir/exampleobject.txt"
	// 填寫Object的版本ID。
	versionId := "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****"

	// 擷取儲存空間。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		HandleError(err)
	}
	// 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
	tag1 := oss.Tag{
		Key:   "owner",
		Value: "John",
	}

	tag2 := oss.Tag{
		Key:   "type",
		Value: "document",
	}

	tagging := oss.Tagging{
		Tags: []oss.Tag{tag1, tag2},
	}

	// 為Object指定版本設定標籤資訊。
	err = bucket.PutObjectTagging(objectName, tagging, oss.VersionId(versionId))

	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println(bucket.GetObjectTagging(objectName))
}

拷貝Object時設定對象標籤

拷貝Object時,可以指定如何設定目標Object的對象標籤。取值如下:

  • Copy(預設值):複製源Object的對象標籤到目標Object。

  • Replace:忽略源Object的對象標籤,直接採用請求中指定的對象標籤。

以下分別提供了簡單拷貝1 GB以下的Object及分區拷貝1 GB以上的Object時設定對象標籤的詳細樣本。

  • 簡單拷貝時設定對象標籤

    以下代碼用於簡單拷貝1 GB以下的Object時設定對象標籤。

    package main
    
    import (
        "fmt"
        "os"
    
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 建立OSSClient執行個體。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
        // 填寫Bucket名稱,例如examplebucket。
        bucketName := "examplebucket"
        // 填寫源Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如srcexampledir/exampleobject.txt。
        srcObjectName := "srcexampledir/exampleobject.txt"
        // 填寫目標Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如destexampledir1/exampleobject.txt。
        destObjectName1 := "destexampledir1/exampleobject.txt"
        // 填寫目標Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如destexampledir2/exampleobject.txt。
        destObjectName2 := "destexampledir2/exampleobject.txt"
    
        // 擷取儲存空間。
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
    
        // 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
        tag1 := oss.Tag{
            Key:   "owner",
            Value: "John",
        }
        tag2 := oss.Tag{
            Key:   "type",
            Value: "document",
        }
        tagging := oss.Tagging{
            Tags: []oss.Tag{tag1, tag2},
        }
    
        // 複製Object時只設定tagging參數,Object標籤資訊不生效。
        _, err = bucket.CopyObject(srcObjectName, destObjectName1, oss.SetTagging(tagging))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
    
        // 複製Object時同時設定TaggingReplace和tagging兩個參數,Object標籤資訊才生效。
        _, err = bucket.CopyObject(srcObjectName, destObjectName2, oss.SetTagging(tagging), oss.TaggingDirective(oss.TaggingReplace))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
    	fmt.Println(bucket.GetObjectTagging(srcObjectName))
    	fmt.Println(bucket.GetObjectTagging(destObjectName1))
    	fmt.Println(bucket.GetObjectTagging(destObjectName2))
    }
  • 分區拷貝時設定對象標籤

    以下代碼用於分區拷貝1 GB以上的Object時設定對象標籤。

    package main
    
    import (
        "fmt"
        "os"
        "strings"
    
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
    	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 建立OSSClient執行個體。
    	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
        // 填寫Bucket名稱,例如examplebucket。
        bucketName := "examplebucket"
        // 填寫源Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如srcexampledir/exampleobject.txt。
        srcObjectName := "srcexampledir/exampleobject.txt"
        // 填寫目標Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如destexampledir/exampleobject.txt。
        destObjectName := "destexampledir/exampleobject.txt"
    
        // 擷取儲存空間。
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
    
        // 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
        tag1 := oss.Tag{
            Key:   "owner",
            Value: "John",
        }
        tag2 := oss.Tag{
            Key:   "type",
            Value: "document",
        }
        tagging := oss.Tagging{
            Tags: []oss.Tag{tag1, tag2},
        }
    
        // 上傳一個Object,用於分區拷貝。
        content := "this your object value"
        err = bucket.PutObject(srcObjectName, strings.NewReader(content))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
    
        // 初始化上傳的檔案,並設定對象標籤。
        imur, err := bucket.InitiateMultipartUpload(destObjectName, oss.SetTagging(tagging))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        // 將Object分成1個分區進行上傳。
        part, err := bucket.UploadPartCopy(imur, bucketName, srcObjectName, 0, int64(len(content)), 1)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        parts := []oss.UploadPart{part}
        _, err = bucket.CompleteMultipartUpload(imur, parts)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        fmt.Println(bucket.GetObjectTagging(destObjectName))
    }

為軟連結檔案設定標籤

以下代碼用於為軟連結檔案設定標籤。

package main

import (
	"fmt"
	"os"
	"strings"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 建立OSSClient執行個體。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 填寫Bucket名稱,例如examplebucket。
	bucketName := "examplebucket"
	// 填寫Object完整路徑,Object完整路徑中不能包含Bucket名稱。例如exampledir/exampleobject.txt。
	objectName := "exampledir/exampleobject.txt"
	// 填寫軟連結完整路徑,例如shortcut/myobject.txt。
	symlinkName := "shortcut/myobject.txt"

	// 擷取儲存空間。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 依次填寫對象標籤的鍵(例如owner)和值(例如John)。
	tag1 := oss.Tag{
		Key:   "owner",
		Value: "John",
	}
	tag2 := oss.Tag{
		Key:   "type",
		Value: "document",
	}
	tagging := oss.Tagging{
		Tags: []oss.Tag{tag1, tag2},
	}

	err = bucket.PutObject(objectName, strings.NewReader("Hello OSS"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	err = bucket.PutSymlink(objectName, symlinkName, oss.SetTagging(tagging))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println(bucket.GetObjectTagging(objectName))
}