2014-04-17 27 views
2

我試圖調整我S3存儲桶中的所有圖片的大小,但是當我將bucket傳遞到resize_images函數時出現錯誤。爲了這個例子,我限制了我拉到5的圖片(讓我們假設我需要維護這個結構)。不能將類型s3.Bucket傳遞到Golang函數

這是我已經越來越錯誤:

./mass_resize.go:92:在函數參數不能使用mybucket(類型* s3.Bucket)類型s3.Bucket

這是代碼:

package main 

import (
    "fmt" 
    "launchpad.net/goamz/aws" 
    "launchpad.net/goamz/s3" 
    "log" 
    "image" 
    "bytes" 
    "github.com/nfnt/resize" 
    "image/jpeg" 
    // "reflect" 
) 

func resize_images(image_keys []s3.Key, mybucket s3.Bucket) { 

    for _, v := range image_keys { 

     // check to see if this image is already in small version 

     image_data, err := mybucket.Get(v.Key) 

     if err != nil { 
      panic(err.Error()) 
     } else { 
      fmt.Println("success") 
     } 

     image_bytes := []byte(image_data) 

     original_image, _, err := image.Decode(bytes.NewReader(image_bytes)) 

     if err != nil { 
      fmt.Println("Error occurred after image.Decode function") 
      panic(err.Error()) 
     } else { 
      fmt.Println("Another success") 
     } 

     new_image := resize.Resize(160, 0, original_image, resize.Lanczos3) 

     if new_image != nil { 
      fmt.Println("Image has been resized"); 
     } 

     buf := new(bytes.Buffer) 
     err = jpeg.Encode(buf, new_image, nil) 

     if err != nil { 
      fmt.Println("Error occurred while encoding the new_image into a buffer") 
      fmt.Println(err) 
     } 

     send_S3 := buf.Bytes() 

     new_path := v.Key + "_sm" 

     PublicRead := s3.ACL("public-read") 

     err = mybucket.Put(new_path, send_S3, "image/jpg", PublicRead) 

     if err != nil { 
      fmt.Println("-----------------------------------------------") 
      fmt.Println("Error occurred in the mybucket.Put function") 
      fmt.Println(err) 
      fmt.Println(v.Key) 
      fmt.Println("-----------------------------------------------") 
     } else { 
      fmt.Println("Upload was successful") 
     } 
    } 

} 

func main() { 
    // connect to S3 
    auth := aws.Auth{ 
     AccessKey: "key", 
     SecretKey: "secret", 
    } 
    useast := aws.USEast 

    connection := s3.New(auth, useast) 
    mybucket := connection.Bucket("bucket") 

    // pull the first 5 picture keys 
    res, err := mybucket.List("", "", "", 5) 
    if err != nil { 
     log.Fatal(err) 
    } 

    resize_images(res.Contents, mybucket) 
} 

任何想法,這個錯誤是什麼意思?還在學習Go,我不明白爲什麼我無法將S3存儲桶傳遞到我的函數中。一個解釋將非常感謝!

回答

5

錯誤意味着您的可變mybucket的類型是「指針s3.Bucket」:*s3.Bucket但該函數需要使用非指針變量。

您可以嘗試調用該函數deferencing指針:

resize_images(res.Contents, *mybucket) 

或者你可以嘗試改變功能的簽名接收指針:

func resize_images(image_keys []s3.Key, mybucket *s3.Bucket) {