Golang에서 준비된 명령문 및 포인터 사용

5219 단어
MySQL에서는 준비된 명령문에 물음표(?)를 사용하여 값을 나타낼 수 있습니다.

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를 반환합니다.

Thingya는 상당히 흥미롭습니다. 이 경우 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)

좋은 웹페이지 즐겨찾기