Golang에서 준비된 명령문 및 포인터 사용
func GetUserId(name string) (int, error) {
stmt, err := dbconn.Db.Prepare(`SELECT id FROM user
WHERE name="?";`) // (1) - BAD
stmt, err := dbconn.Db.Prepare(`SELECT id FROM user
WHERE name=?;`) // (2) – GOOD
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
var userId int
err = stmt.QueryRow(name).Scan(&userId) // (3)
if err != nil {
if err != sql.ErrNoRows {
log.Fatal(err)
}
return 0, err
}
return userId, nil
}
위의 Go 코드에서
dbconn
는 MySQL 서버에 대한 연결입니다. 1행은 준비된 명령문을 정의합니다. 그리고 3행은 테이블에서 name
열이 변수name
값과 일치하는 행을 쿼리합니다. 이 쿼리의 ?
가 실제 문자열로 보간될 것이라고 가정했습니다. MySQL CLI에서 문자열 주위에 인용 부호가 필요하기 때문에 인용 부호를 추가했습니다.이것은 아무것도 반환하지 않습니다. 따옴표를 제거하면 문제가 해결되었습니다. 올바른 코드는 2행에 있습니다.
3호선도 상당히 흥미롭습니다. 여기서 먼저
stmt.QueryRow()
는 sql.Row
개체에 대한 포인터를 반환합니다. 그런 다음 Scan()
메서드는 두 가지 흥미로운 작업을 수행합니다. a) 출력 값에 "dest"을 설정하고 b) 오류가 있는 경우 오류를 반환하고 오류가 없는 경우 nil
를 반환합니다.Thingy
a
는 상당히 흥미롭습니다. 이 경우 Scan()
메서드는 변수userId
의 메모리 주소를 찾아 거기에 출력 값(사용자 ID)을 씁니다.DB에서 값을 가져오는 것이 부작용인 것처럼 느껴집니다.
JSON 문자열을 디코딩할 때도 마찬가지입니다. this example 4행에서
Unmarshal()
메서드는 JSON 문자열의 압축을 풀고 &animals
변수의 주소인 animals
에 씁니다. 그리고 이것은 부작용입니다. 반환 값은 다시 오류 또는 nil
입니다. 오류가 있으면 단순히 무시할 수 없습니다.var jsonBlob = []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
type Animal struct {
Name string
Order string
}
var animals []Animal
// (4)
err := json.Unmarshal(jsonBlob, &animals)
Reference
이 문제에 관하여(Golang에서 준비된 명령문 및 포인터 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/t0nghe/using-prepared-statements-pointers-in-golang-4oip텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)