Skip to content

Latest commit

 

History

History
145 lines (102 loc) · 7.06 KB

05_var.md

File metadata and controls

145 lines (102 loc) · 7.06 KB

Хувьсагч

Бид заавар өгч тооцоолсон үр дүнгээ хадгалах хэрэгтэй. Хувьсагч энэ боломжийг олгоно. Хувьсагч бол өгөгдөл хадгалах үндсэн нэгж юм. Гэхдээ өгөгдлийг түр хугацаанд санах ойд хадгална, ө.х програм ажиллах хугацаанд хадгална. Програм ажиллаж дуусаад санах ойгоос буухад хувьсагчид алга болж санах ойгоос цэвэрлэгдэнэ.

Хувьсагчийн хадгалж байгаа утга нь програм ажиллах явцад хувьсан өөрчлөгдөж байдаг учраас хувьсагч гэж нэрлэдэг.

Хувьсагчид нэр оноох

Програмд олон хувьсагчийг хооронд нь ялгах зорилгоор нэр өгдөг. Нэр нь утга учиртай, тодорхой, тухайн хувьсагчийн зориулалтад тохирсон байх хэрэгтэй.

Дараах кодонд a, b бүхэл тоон хувьсагчид зарласан нь ойлгомжтой байна. Гэвч юунд зориулсан хувьсагчид вэ гэдэг нь ойлгомжгүй байна.

var a int
var b int

Арай тодорхой болгож дараах байдлаар зарласан нь илүү дээр байна:

var accountNumber int
var balanceOwed   float64

Хувьсагчид нэр оноохдоо дараах дүрмийг мөрдөх хэрэгтэй:

  • Нэр нь ойлгомжтой, утга учиртай байх
  • Нэр нь үсэг, тоо агуулсан байвал зохино. Доогуур зураас _ зэрэг тэмдэгтүүдийг нэрэнд ашиглах хэрэггүй
  • Пакетын гадна ашиглах хувьсагчийг том үсгээр эхлүүлж бичнэ (Sam), дотор ашиглах бол жижгээр бичнэ (sam).
  • Go хэлний нөөц үгүүдийг нэр болгон ашиглаж болохгүй. Go хэлэнд 25 түлхүүр үг бий. Эдгээр нь тус бүрдээ өөрийн гэсэн зориулалттай байна.
  • Нэрийг хэт товчлохоос зайлсхийх

Зөв нэрсийн жишээ:

average         /* бүх онооны дундаж */
pi             /* pi тогтмол */
numberOfStudents /* анги дахь оюутны тоо */

Буруу нэрс:

3rd_entry     /* Тоогоор эхэлсэн */
all$done     /* "$" агуулсан */
the end     /* Сул зай агуулсан */
int         /* Нөөцөлсөн үг */

Хувьсагчийн орших хүрээ ба хугацаа

Хувьсагч нь тодорхой хүрээ, хугацаанд "амьд" байдаг. Хүрээ гэдэг нь тухайн хувьсагч програмын ямар мужид хүчинтэйг илэрхийлнэ. Хүрээнээс хамааран хувьсагчийг глобал болон локал хүрээний хувьсагч гэж ангилдаг.

Глобал хувьсагч нь програмын аль ч хэсэгт хүчинтэй бөгөөд түүний хүрээ нь програм бүтнээрээ байдаг.

package main
import "fmt"

var x string = "Hello World"

func main() {
    fmt.Println(x)
}
func f() {
    fmt.Println(x)
}

Локал хувьсагч нь түүний зарлагдсан блок дотор л хүчинтэй бөгөөд блокоос гадна уг хувьсагчид хандах боломжгүй болно.

package main
import "fmt"

func main() {
    var x string = "Hello World"
    fmt.Println(x)
}
func f() {
    // АЛДАА: x хувьсагчид эндээс хандах боломжгүй
    fmt.Println(x)
}

Төрөл хувиргах

Go хэлэнд ялгаатай төрлийн хувьсагчдыг нэг илэрхийлэлд оруулах шаардлага гардаг. Энэ үед хөрвүүлэгч нь тэдгээрийг үйлдэлд оролцохын өмнө нэгэн ижил төрөл рүү хувиргахыг оролддог. Хэрэв нэг төрөлд оруулж чадахааргүй бол хувьсагчийн төрлийг хувиргахыг шаарддаг.

Go хэлэнд хувиргалтыг хоёр аргаар хийдэг.

Хувиргах үйлдэл Тайлбар Жишээ
төрөл(хувьсагч) Тодорхой төрлүүдийн хооронд хувиргах. Жнь: int32(11)
хувьсагч.(төрөл) Тодорхой бус төрлүүдийн хооронд хувиргах Жнь: x.(string)

Энд x нь interface буюу тодорхой бус төрөлтэй хувьсагч. Тухайлбал бүхэл тоон төрлүүдийн хооронд хувиргалт хийх бол төрөл(хувьсагч) хувилбарыг ашиглана. Учир нь төрөл нь тодорхой, мөн ойролцоо байна.

Тоон төрлийн хэмжээнээс хамаараад хувиргалт ялгаатай явагдана. Том хэмжээтэй хувьсагчид бага хэмжээтэй утга оноох үед алдаагүй хувиргалт хийнэ. Харин бага хэмжээтэй хувьсагчид том хэмжээтэй утга оноох бол өгөгдлийн зарим хэсэг алдагдах эрсдэлтэй.

int8 < int15 < int32 < int64

Жишээлбэл бүхэл, бодит тоог илэрхийлэлд хослуулан хэрэглэх бол төрөл хувиргалт хэрэгтэй болно:

package main
import "fmt"

var won, lost int = 5, 3

func main() {
  ratio:= float32(won) / float32(lost)
  fmt.Printf("хожил/хожигдолын харьцаа = %f\n", ratio)
}

Дараах жишээнд anything нэртэй тодорхой бус төрөлтэй хувьсагчийг тэмдэгт мөр болгон хувиргаж байна.

var anything interface{} = 123
aString:=anything.(string)

Хэрэв хувиргалтад алдаа гарвал програм тасрах болно. Үүнээс сэргийлэхийн тулд үр дүнг дараах байдлаар шалгах хэрэгтэй.

aString, found := anything.(string)

Хувиргаж байгаа өгөгдлийн төрлийг мэдэхгүй бол .(type) үйлдлийг ашиглаж төрлийг мэдэж болно.

switch v := anything.(type) {
    // төрлөөс хамааран үйлдэл хийх, v нь төрлийн нэр байна
    case string:
        fmt.Println(v)
    case int, int32, int64:
        fmt.Println(v)
    default:
        fmt.Println("unknown")
}