type은 go 구문에서 중요하고 일반적으로 사용되는 키워드입니다. type은 C/C++의 typedef에만 해당하는 것이 아닙니다. 유형을 사용하는 방법에는 두 가지가 있습니다. 하나는 유형 별칭이고 다른 하나는 유형 정의입니다. 익숙한 C 언어(define 및 typedef)입니까? ㅋㅋㅋ
정의 구조
구조는 사용자가 정의한 추상 데이터 구조입니다. golang의 구조체는 프로그래밍에서 결정적인 역할을 합니다. 구조체의 사용법은 struct 키워드에서 자세히 소개됩니다. 구조 정의의 문법 형식을 살펴보겠습니다. type Student struct {
name String
age int
}
type I int
인터페이스 관련 지식 포인트는 인터페이스 키워드에서 자세히 소개됩니다.
type Sdt = Student type I = int유형 정의
유형 정의를 사용하여 정의된 유형은 원래 유형과 다르기 때문에 강제 유형 변환을 사용하지 않는 한 새 유형 변수를 사용하여 원래 유형 변수에 값을 할당할 수 없습니다. 문자열 유형을 기반으로 새 유형을 정의하는 샘플 코드를 살펴보겠습니다. 새 유형 이름은 name입니다.
type name struct { Field1 dataType Field2 dataType Field3 dataType }
유형 정의를 사용하는 이유는 무엇입니까?
유형 정의는 원래 유형을 기반으로 새 유형을 생성할 수 있습니다. 경우에 따라 다음 예제 코드와 같이 코드를 더 간결하게 만들 수 있습니다.
type name interface{ Read() Write() }
출력 정보는 다음과 같습니다. type name string
위의 예는 단순 유형 정의 애플리케이션 시나리오에서 유형 정의가 사용되지 않는 경우 위 예의 기능을 달성하려면 이 코드를 어떻게 작성해야 합니까?
package main import ( "fmt" ) // 定义一个接收一个字符串类型参数的函数类型 type handle func(str string) // exec函数,接收handle类型的参数 func exec(f handle) { f("hello") } func main() { // 定义一个函数类型变量,这个函数接收一个字符串类型的参数 var p = func(str string) { fmt.Println("first", str) } exec(p) // 匿名函数作为参数直接传递给exec函数 exec(func(str string) { fmt.Println("second", str) }) }
exec 함수의 매개변수 유형을 func(str string)으로 바꿔야 합니다. 언뜻 복잡해 보이지 않지만, exec가 5개의 매개변수가 필요한 함수 변수를 받으면 어떻게 될까요? 매개변수 목록이 매우 길어질 것 같나요?
first hello second hello
위 코드를 보면 exec 함수의 매개변수 목록의 가독성이 나빠진 것을 확인할 수 있습니다. 유형 정의를 사용하여 이 함수를 구현하는 방법을 살펴보겠습니다. // exec函数,接收handle类型的参数
func exec(f func(str string)) {
f("hello")
}
Type alias 이 기능은 golang1.9에서 도입되었습니다. 유형 별칭을 사용하여 정의된 유형은 원래 유형과 동일합니다. 즉, 원래 유형의 변수에 할당될 수 있으며 원래 유형의 모든 메서드 세트를 갖습니다. 문자열 유형에 별칭을 지정합니다. 별칭 이름은 다음과 같습니다. func exec(f func(str string, str2 string, num int, money float64, flag bool)) {
f("hello")
}
유형 별칭과 유형 정의의 차이점은 유형 별칭을 사용하려면 별칭과 원래 유형 사이에 할당 기호(=)를 추가해야 한다는 것입니다. 유형 별칭은 유형을 정의합니다. 원래 유형과 동일하며 해당 유형을 사용하여 정의된 유형은 새로운 유형입니다.
아래 예:
package main import ( "fmt" ) // 定义一个需要五个参数的函数类型 type handle func(str string, str2 string, num int, money float64, flag bool) // exec函数,接收handle类型的参数 func exec(f handle) { f("hello", "world", 10, 11.23, true) } func demo(str string, str2 string, num int, money float64, flag bool) { fmt.Println(str, str2, num, money, flag) } func main() { exec(demo) }
이 코드는 컴파일 시 다음 오류를 발생시킵니다.
type name = string
오류 메시지에서 str은 문자열 유형이고 b 유형 매개변수로 SayB 함수에 전달될 수 없다는 것을 알 수 있습니다. 그러나 str은 유형 매개변수로 SayA 함수에 전달될 수 있습니다. 타입 별명을 사용하여 정의한 타입은 원래 타입과 일치하는 반면, 타입 정의에 의해 정의된 타입은 새로운 타입임을 알 수 있다.
타입 별칭에 메소드를 추가하면 원래 타입 메소드 세트에 추가됩니다.
타입 별칭에 메소드를 추가하면 원래 타입도 이 메소드를 사용할 수 있습니다. 아래 샘플 코드를 참조하세요.
package main import ( "fmt" ) type a = string type b string func SayA(str a) { fmt.Println(str) } func SayB(str b) { fmt.Println(str) } func main() { var str = "test" SayA(str) //错误参数传递,str是字符串类型,不能赋值给b类型变量 SayB(str) }
출력 정보는 다음과 같습니다.
.\main.go:21:6: cannot use str (type string) as type b in argument to SayB
위 예에서 S는 원래 유형이고 T는 S 유형 별칭입니다. T에 Hello 메소드를 추가한 후 S 유형의 변수도 Hello 메소드를 사용할 수 있습니다. 유형 별명에 메소드를 추가한 후 원래 유형도 이 메소드를 사용할 수 있습니다. 예제에서 볼 수 있듯이 변수 t는 S 타입 변수 s에 할당될 수 있으므로 타입 별칭은 본질적으로 아무런 변화 없이 원래 타입에 대한 별명입니다.
유형 별칭은 동일한 패키지의 사용자 정의 유형에서만 작동할 수 있습니다. 예를 들어 golang SDK에는 많은 패키지가 있습니다. SDK 패키지의 구조 유형에 새 메소드를 추가하기 위해 유형 별칭을 사용할 수 있습니까? 대답은: 아니오입니다. 한 가지 기억하세요. 유형 별칭은 패키지 내의 유형에만 영향을 미칠 수 있습니다. 유형 별칭이 패키지 외부 유형에 사용되는 경우 컴파일 중에 다음 정보가 표시됩니다. package main
import (
"fmt"
)
// 根据string类型,定义类型S
type S string
func (r *S) Hi() {
fmt.Println("S hi")
}
// 定义S的类型别名为T
type T = S
func (r *T) Hello() {
fmt.Println("T hello")
}
// 函数参数接收S类型的指针变量
func exec(obj *S) {
obj.Hello()
obj.Hi()
}
func main() {
t := new(T)
s := new(S)
exec(s)
// 将T类型指针变量传递给S类型指针变量
exec(t)
}
Type 쿼리는 변수를 기반으로 합니다. , 이 변수의 유형을 쿼리합니다. 왜 그런 필요가 있습니까? goalng에는 특수 유형 인터페이스{}가 있습니다. 이 유형은 모든 유형의 변수에 할당될 수 있습니다. 인터페이스{} 유형 변수에 어떤 유형의 변수가 할당되어 있는지 알고 싶다면 이를 해결하기 위해 유형 쿼리를 사용해야 합니다. 요구 사항은 다음과 같습니다.
T hello S hi T hello S hi
.(type)을 사용하는 쿼리 유형의 변수가 인터페이스{} 유형이 아닌 경우 컴파일 중에 다음 오류가 보고됩니다.
cannot define new methods on non-local type string
.(type)을 사용하는 경우 스위치 외부에서는 컴파일 중에 다음 오류가 보고됩니다. 다음 오류가 표시됩니다:
package main import ( "fmt" ) func main() { // 定义一个interface{}类型变量,并使用string类型值”abc“初始化 var a interface{} = "abc" // 在switch中使用 变量名.(type) 查询变量是由哪个类型数据赋值。 switch v := a.(type) { case string: fmt.Println("字符串") case int: fmt.Println("整型") default: fmt.Println("其他类型", v) } }
따라서 유형 쿼리에 유형을 사용할 경우 스위치에서만 사용할 수 있으며 유형 쿼리에 사용되는 변수 유형은 다음과 같아야 합니다. 인터페이스{}
PHP 중국어 웹사이트에는 무료
Golang 입문 튜토리얼이 많이 있습니다. 누구나 배울 수 있습니다!
위 내용은 golang 유형은 무엇을 의미합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!