Written by
on
on
aws-lambda-in-go
func Handler(ctx context.Context) error {
file, err := os.Open("config.json")
if err != nil{
return err
}
defer file.Close()
conf := Configuration{}
err = json.NewDecoder(file).Decode(&conf)
if err != nil {
return err
}
// Initialize connection string
host, user, password, database := conf.Host, conf.User, conf.Password, conf.Database
var connectionString = fmt.Sprintf("host=%s user=%s password=%s dbname=%s", host, user, password, database)
db, err := sql.Open("postgres", connectionString)
if err != nil {
return err
}
defer db.Close()
// TODO: 유저 프로파일 찌르기
rows, err := db.Query("select * from experiments limit 5")
if err != nil {
return err
}
defer rows.Close()
cols, err := rows.Columns()
rowValues := make([][]interface{}, 0)
vals := make([]interface{}, len(cols))
// pointer of interface
for i := range cols{
vals[i] = new(interface{})
}
for rows.Next() {
rowValue := make([]interface{}, len(cols))
err := rows.Scan(vals...)
if err != nil {
return err
}
for i := range cols{
rowValue = append(rowValue, *(vals[i]).(*interface{}))
}
rowValues = append(rowValues, rowValue)
}
fmt.Print(strings.Join(cols, ","))
for i := range rowValues{
fmt.Print(rowValues[i])
}
// testcases
// request에 있는걸로 / response 비교
// 매번 connnection (1분 1번)
// TODO: Close!
// Request -> user profile api
return nil
}
https://www.calhoun.io/using-postgresql-with-go/
// 매번 connnection (1분 1번)
json.compact json을 비교하는데 똑같은 json이 자꾸 bytes.Compare 시에 다르다고 나와서 뭔가 했더니, 공백때문에 5개 byte가 더 길게 나왔다. 공백을 제거하기 위해 bytes.TrimSpace 이런거를 써도 JSON string 안에 공백이 있거나 하면 동작이 제대로 안된다. 오히려 데이터를 요상하게 만들 수 있으므로, JSON 내의 공백을 제거하거나 할때 json.Compact를 사용하도록 한다. buffer 를 만들고 해당 buffer에 공백을 제거할 json string을 넣는 방식으로 하면된다.
package main
import "bytes"
import "fmt"
import "encoding/json"
func main() {
var jsonb = []byte(`{
"foo": "bar"
}`)
buffer := new(bytes.Buffer)
if err := json.Compact(buffer, jsonb); err != nil {
fmt.Println(err)
}
fmt.Println(buffer)
}
Buffer 을 만들때 new(Buffer) (or just declaring a Buffer variable) is sufficient to initialize a Buffer
위의 예시에서처럼 new(bytes.Buffer)를 하던지,
buffer := &bytes.Buffer{}
이런식으로 생성한뒤 주소값을 넣어주면된다.
var buffer *bytes.Buffer
이런식으로 빈 값을 가르키는 포인터만 만들면 메모리 참조 panic이 날수있으니 조심해야한다.