기본 콘텐츠로 건너뛰기

golang에서 인터페이스 Type Assertion 처리하기





인터페이스: Type assertion 


인터페이스를 이용하여 메소드가 아닌 일반 변수에 할당하며 변수에 정의된 타입들에 대해 명확히 구분할 수 있다.   

Var 변수명 interface{} 로 정의하면 일반 변수정의 타입들도 전달할 수 있다
    //구조체 정의 
var a BB = BB{X:10} 

//Type assertion 정의 
   var value interface{} 

   // 할당 
   value = a 
   //value.(타입) 
    fmt.Println("  type assertion ", value.(BB))  //출력값 {10} 

리턴값을 interface{}  type assertion 을 처리하도록 정의 
func weird(i intinterface{} { 
     if i < 0 { 
        return "negative" 
     } 
     return i 
} 

 func main() { 
var i = 42 
    if w, ok := weird(7).(int); ok { 
        i += w 
    } 
    if w, ok := weird(-100).(int); ok { 
        i += w 
    } 
      fmt.Println("i =", i) 
} 
//결과값은 49 

Type Assertion을 이용하여 타입값들을 확인이 필요한 경우 

var i = 49 
var myInterface interface{}  
   myInterface = i 
   switch v := myInterface.(type) { 
case int: 
      // v is an int here, so e.g. v + 1 is possible. 
      fmt.Printf("Integer: %v", v) 
case float64: 
       // v is a float64 here, so e.g. v + 1.0 is possible. 
       fmt.Printf("Float64: %v", v) 
case string: 
    // v is a string here, so e.g. v + " Yeah!" is possible. 
      fmt.Printf("String: %v", v) 
default: 
       // And here I'm feeling dumb. ;) 
       fmt.Printf("I don't know, ask stackoverflow.") 

//결과값 
Integer: 49 





댓글

이 블로그의 인기 게시물

golang overload 처럼 처리하기

go 언어에서는 함수명이 같을 경우 재선언 오류를 발생시킨다. 다른 메소드를 만들고 오버로드 처리하도록 설계해서 구현해야 한다. 오버로드 처리를 위해 type switch를 사용해서 들어오는 타입에 따라 메소드 호출하는 처리를 사용한다. 함수나 메소드 인자를 다양하게 처리하려면 []interface{} 로 정의해서 다양한 인자를 받아서 오버로딩 처리하면된다. package main import (  "fmt" ) func main() {  var p Person  p = Person{"dahl"}  var s string = "moon"  fmt.Println(" overloading  ", p.Overload(s))  fmt.Println(" overloading", p.Overload(nil)) } type Person struct {  name string } func (this *Person) Overload(args interface{}) string {  switch args.(type) {  case string:   return this.GetName2("moon")  case nil:   return this.GetName1()  default:   return " no match"  } } func (this *Person) GetName1() string {  return this.name } func (this *Person) GetName2(s string) string {  return this.name }

Python으로 julian date 산출하기

줄리안 일수 산출을 위해서는 윤년여부 체크를 하여 실제 그 해의 해당 일자에 대한 일수를 365 나 366 일수에 해당 일자로 전환하여 산출한다. 현재 일자를 줄리안 즉 시퀀스 일자대로 수정하는 로직이다 #일자 산출 함수 def dayconvert(month) :      convertDay = 0      dayDict = {'01':0, '02':31, '03':59, '04':90, '05':120,      '06':151, '07':181, '08':212, '09':243, '10':273,      '11':304, '12':334}      convertDay = dayDict[month]      return convertDay #줄리안데이 산출 함수 def julian(date):     year = int(date[0:4])    month = date[4:6]    day = int(date[6:8])    #윤년여부 호출   yuncheck = yunyear(year)   # 일자산출   Dday = dayconvert(month)   # 줄리안 데이 산출   Dday = Dday + day   # 유년여부 체크 및 윤년일 경우 일수조정   if yuncheck == 1:       if int(month) > 2 :            Dday = Dday + 1   # 100일 미만일 경우 포맷조정 ...

golang에서 struct 구조체를 이용해서 File Read/Write 처리하기

입력 파일을 읽고 구조체에 넣고 구조체를 보고 아웃 파일에 쓰기를 처리한다.    -  구조체를 정의하고 구조체 Get()/Set() 메소드를 정의한다.   -    구조체를 보관하는 Array를 정의한다.    - 파일을 읽어서 구조체 Set() 메소드로 세팅한다    - 구조체 Get() 메소드를 구조체 정보를 읽어 파일에 쓰기한다. package main import ( "bufio" "fmt" _ "io" "log" "os" ) type User struct { id   string name string } func (user *User) Set(any []byte) { user.id = string(any[:13]) user.name = string(any[13:23]) } func (user *User) Get() string { return user.id + user.name + "\n" } func main() { fmt.Println(" exec file read/write ") var arrayusers []*User = make([]*User, 2) filein, err := os.Open("../input.txt") if err != nil { log.Fatal(err) } defer filein.Close() scanner := bufio.NewScanner(filein) i := 0 for scanner.Scan() { user := new(User) text := scanner.Text() user.Set([]byte(text)) arrayusers[i] = user i = i + 1 } if err := scanner.Er...