golang 유형은 무엇을 의미합니까?

爱喝马黛茶的安东尼
풀어 주다: 2019-12-10 10:26:04
원래의
3714명이 탐색했습니다.

golang 유형은 무엇을 의미합니까?

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

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 query

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿