Type และ Struct ใน Go
Type และ Struct ใน Go
การประกาศ Type ใน Go
go สามารถประกาศชนิดของตัวแปรขึ้นมาเองได้ โดยการใช้ keyword "type" นำหน้า
type <ชื่อ type> ชนิดของตัวแปร
Example:
type fahrenheit float32
type celcius float32
จากโค้ดตัวอย่างข้างบน ชนิดตัวแปร fahrenheit และ celcius มีชนิดเป็น float32 ทั้งคู่ แต่ไม่สามารถนำมาใช้แทนกันได้ เราประกาศ type ขึ้นมาเองเพื่อความง่ายในการเข้าใจโค้ด
Example: เกิด error ขึ้นเมื่อพยายามใช้ type ที่ต่างกัน
package main
type fahrenheit float32
type celcius float32
func main() {
var tem1 fahrenheit = 235.23
var tem2 celcius = tem1 // error
}
การประกาศ Struct ใน Go
struct ใน ภาษา Go คือ ตัวแปรแบบ user-defined ก็คือผู้เขียนเป็นคนกำหนดเอง ซึ่ง struct สามารถรวมตัวแปรหลายๆตัว และหลายประเภทเข้าเข้ามาอยู่รวมกันเป็น type เดียวกันได้ concept ของ struct จะคล้ายกับ class ในภาษาที่เป็น OOP
type <ชื่อ struct> struct {
// ข้อมูลเกี่ยวกับ struct นั้นๆ
}
ก่ารนำ struct ไปใช้งาน
var <ชื่อตัวแปร> <ชื่อ struct> = <ชื่อ struct>{ /*ตามด้วยข้อมูลที่เราต้องใส่ใน struct*/ }
// หรือ ใช้ shorthand declaration (type inference declaration)
<ชื่อตัวแปร> := <ชื่อ struct>{/*ตามด้วยข้อมูลที่เราต้องใส่ใน struct*/}
การประกาศและนำ struct ไปใช้ มีให้ดังตัวอย่างต่อไปนี้
Example 1: การประกาศ struct และ การนำ struct ไปใช้
package main
import "fmt"
// struct declaration
type User struct {
name string
age uint
email string
}
func main() {
var john User = User{
name: "John",
age: 20,
email: "[email protected]",
}
// หรือ
var john User = User{"John", 20, "[email protected]", }
fmt.Println(john) // {John 20 [email protected]}
}
ตัวอย่างต่อไปนี้แสดงการดึงข้อมูลจาก struct ที่เราสร้างขึ้นมาแล้วมาใช้ และการ declare struct ซึงมี function อยู่ด้วย
Example 2: การประกาศ struct ซึ่งมี function รวมอยู่ด้วย
package main
import "fmt"
// struct declaration
type User struct {
name string
age uint
email string
// struct สามารถมี function รวมอยู่ด้วย
speak func(string) string
}
func main() {
var john User = User{
name: "John",
age: 20,
email: "[email protected]",
speak: func(str string) string {
return "User say: " + str
},
}
fmt.Println("Name: ", john.name) // Name: John
fmt.Println("Age: ", john.age) // Age: 20
fmt.Println("Email: ", john.email) // Email: [email protected]
fmt.Println(john.speak("Hi")) // User say: Hi
}
จากตัวอย่างด้านบนจะเห็นว่าเราสามารถเข้าถึงข้อมูลที่เก็บไว้ใน struct โดยใช้ ชื่อของ (john) ตัวแปรที่ประกาศชนิดเป็น User
Example 3: การใช้ struct ในการเก็บข้อมูลคู่อันดับในกราฟ
package main
import (
"fmt"
"math"
)
type Point struct {
x float64
y float64
}
func main() {
var p1 Point = Point{12.3, 20.0}
var p2 Point = Point{5.4, 15.2}
fmt.Println("Distance between p1 and p2 is ", findDistance(p1, p2)) // Distance between p1 and p2 is 8.40535543567314
}
func findDistance(p1 Point, p2 Point) float64 {
var deltaX float64 = math.Abs(p1.x - p2.x)
var deltaY float64 = math.Abs(p1.y - p2.y)
return math.Sqrt(deltaX*deltaX + deltaY*deltaY)
}
NOTE: สำหรับการตั้งชื่อหากตัวแรกเป็นตัวใหญ่จะทำให้เข้าถึงได้จาก package ภายนอก ดังที่ได้กล่าวไปในบทที่แล้ว