Go에는 몇 가지 데이터 유형이 있나요?

青灯夜游
풀어 주다: 2023-01-10 14:38:22
원래의
2345명이 탐색했습니다.

Go에는 네 가지 데이터 유형이 있습니다. 1. 정수, 부동 소수점 숫자, 복소수, 부울 값, 문자열 및 상수를 포함한 기본 유형 2. 배열 및 구조를 포함한 집계 유형(엔티티로 구성된 집계 데이터 유형) 0개 이상의 모든 유형의 값으로 구성됩니다. 각 값은 구조체의 멤버라고 합니다. 3. 포인터, 슬라이스, 맵, 함수 및 채널을 포함한 참조 유형. 행동의 추상화 및 일반화는 추상화의 한 유형입니다.

Go에는 몇 가지 데이터 유형이 있나요?

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

Go의 데이터 유형은 기본 유형, 집계 유형, 참조 유형 및 인터페이스 유형의 네 가지 주요 범주로 나뉩니다.

  • 기본 유형은 정수, 부동 소수점 수, 복소수, 부울 값, 문자열, 상수로 구분됩니다.
  • 집계 유형에는 배열, 구조가 포함됩니다.
  • 참조 유형에는 포인터, 슬라이스, 맵, 함수, 채널이 포함됩니다
  • 인터페이스 유형

기본 유형

정수:

// int8 is the set of all signed 8-bit integers.
// Range: -128 through 127.
type int8 int8

// int16 is the set of all signed 16-bit integers.
// Range: -32768 through 32767.
type int16 int16

// int32 is the set of all signed 32-bit integers.
// Range: -2147483648 through 2147483647.
type int32 int32

// int64 is the set of all signed 64-bit integers.
// Range: -9223372036854775808 through 9223372036854775807.
type int64 int64

// uint8 is the set of all unsigned 8-bit integers.
// Range: 0 through 255.
type uint8 uint8

// uint16 is the set of all unsigned 16-bit integers.
// Range: 0 through 65535.
type uint16 uint16

// uint32 is the set of all unsigned 32-bit integers.
// Range: 0 through 4294967295.
type uint32 uint32

// uint64 is the set of all unsigned 64-bit integers.
// Range: 0 through 18446744073709551615.
type uint64 uint64

// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8

// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32

// int is a signed integer type that is at least 32 bits in size. It is a
// distinct type, however, and not an alias for, say, int32.
type int int

// uint is an unsigned integer type that is at least 32 bits in size. It is a
// distinct type, however, and not an alias for, say, uint32.
type uint uint
로그인 후 복사

부동 소수점

// float32 is the set of all IEEE-754 32-bit floating-point numbers.
type float32 float32

// float64 is the set of all IEEE-754 64-bit floating-point numbers.
type float64 float64
로그인 후 복사

복수형

// complex64 is the set of all complex numbers with float32 real and
// imaginary parts.
type complex64 complex64

// complex128 is the set of all complex numbers with float64 real and
// imaginary parts.
type complex128 complex128

// The complex built-in function constructs a complex value from two
// The complex built-in function constructs a complex value from two
// floating-point values. The real and imaginary parts must be of the same
// size, either float32 or float64 (or assignable to them), and the return
// value will be the corresponding complex type (complex64 for float32,
// complex128 for float64).
func complex(r, i FloatType) ComplexType

// The real built-in function returns the real part of the complex number c.
// The return value will be floating point type corresponding to the type of c.
func real(c ComplexType) FloatType

// The imag built-in function returns the imaginary part of the complex
// number c. The return value will be floating point type corresponding to
// the type of c.
func imag(c ComplexType) FloatType
로그인 후 복사

부울 값

// bool is the set of boolean values, true and false.
type bool bool

// true and false are the two untyped boolean values.
const (
	true  = 0 == 0 // Untyped bool.
	false = 0 != 0 // Untyped bool.
)
로그인 후 복사

string

// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing UTF-8-encoded text. A string may be empty, but
// not nil. Values of string type are immutable.
type string string
로그인 후 복사

constant

// iota is a predeclared identifier representing the untyped integer ordinal
// number of the current const specification in a (usually parenthesized)
// const declaration. It is zero-indexed.
const iota = 0 // Untyped int.
로그인 후 복사

집계 유형

  • 배열과 구조체는 집계 유형입니다.
  • 그 값은 다음과 같습니다. 여러 요소나 멤버 필드의 값으로 구성됩니다.
  • 배열은 동형 요소로 구성됩니다. 각 배열 요소는 정확히 동일한 유형이지만 구조는 이종 요소로 구성됩니다.
  • 배열과 구조는 모두 메모리 크기가 고정된 데이터 구조입니다.
  • 반면에 슬라이스와 맵은 필요에 따라 동적으로 증가하는 동적 데이터 구조입니다.

Array

a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // compile error: cannot compare [2]int == [3]int
로그인 후 복사
  • 배열의 요소 유형을 서로 비교할 수 있다면 배열 유형도 서로 비교할 수 있습니다. 이때 두 가지를 직접 비교할 수 있습니다. == 비교 연산자 배열을 통해 배열은 두 배열의 모든 요소가 동일한 경우에만 동일합니다. 같지 않음 비교 연산자 !=는 동일한 규칙을 따릅니다.
  • 함수가 호출되면 함수의 각 호출 매개변수가 함수 내부의 매개변수 변수에 할당되므로 함수 매개변수 변수는 원래 호출의 변수가 아닌 복사된 복사본을 받습니다. 함수 매개변수 전달 메커니즘으로 인해 큰 배열 유형을 전달하는 것이 비효율적이므로 배열 매개변수에 대한 수정은 복사된 배열에서 발생하며 호출 시 원래 배열 변수를 직접 수정할 수 없습니다 . 값 전달로 호출
  • 우리는명시적으로 배열 포인터를 전달할 수 있습니다. 이 경우 포인터를 통한 함수에 의한 배열 수정은 호출자에게 직접 피드백될 수 있습니다

구조

  • 구조는 집계된 데이터 유형으로, 모든 유형의 0개 이상의 값에서 집계된 엔터티입니다. 각 값을 구조체의 멤버라고 합니다.
  • 구조체 멤버 이름이 대문자로 시작하면 멤버가 내보내집니다.
1,
结构体值也可以用结构体面值表示,结构体面值可以指定每个成员的值。

type Point struct{ X, Y int }
p := Point{1, 2}

2,
以成员名字和相应的值来初始化,可以包含部分或全部的成员,

anim := gif.GIF{LoopCount: nframes}

在这种形式的结构体面值写法中,如果成员被忽略的话将默认用零值。

3,
因为结构体通常通过指针处理,可以用下面的写法来创建并初始化一个结构体变量,并返回结构体的地址:

pp := &Point{1, 2}

它是下面的语句是等价的

pp := new(Point)
*pp = Point{1, 2}

不过&Point{1, 2}写法可以直接在表达式中使用,比如一个函数调用。
로그인 후 복사
  • 구조체의 모든 멤버가 비교 가능하면 구조도 비교 가능합니다. 이 경우 두 구조는 다음을 사용하여 비교됩니다. 또는 != 연산자. 같음 비교 연산자 는 두 구조의 각 멤버를 비교하므로 다음 두 비교 표현식은 동일합니다. 값의 메모리 주소.
  • type Point struct{ X, Y int }
    
    p := Point{1, 2}
    q := Point{2, 1}
    fmt.Println(p.X == q.X && p.Y == q.Y) // "false"
    fmt.Println(p == q)                   // "false"
    로그인 후 복사
포인터 사용 프로세스:

포인터 변수를 정의합니다. 포인터 변수에 값을 할당합니다.

포인터 변수의 주소를 가리키는 값에 접근하세요. 포인터가 가리키는 내용을 얻으려면 포인터 유형 앞에 * 기호(접두사)를 추가하세요.

var ip *int        /* 指向整型*/  ip是一个指向int类型对象的 指针
var fp *float32    /* 指向浮点型 */  fp是一个指向float32类型对象的 指针
로그인 후 복사

slice

  • Slice(슬라이스)는 가변 길이 시퀀스를 나타내며 시퀀스의 각 요소는 동일한 유형을 갖습니다.
  • 슬라이스 유형은 일반적으로 []T로 작성됩니다. 여기서 T는 슬라이스의 요소 유형을 나타냅니다.
  • 슬라이스의 구문은 고정 길이가 없다는 점을 제외하면 배열의 구문과 매우 유사합니다.
       var a int= 20   /* 声明实际变量 */
       var ip *int        /* 声明指针变量 */
    
       ip = &a  /* 指针变量的存储地址 */
    
       fmt.Printf("a 变量的地址是: %x\n", &a  )
    
       /* 指针变量的存储地址 */
       fmt.Printf("ip 变量储存的指针地址: %x\n", ip )
    
       /* 使用指针访问值 */
       fmt.Printf("*ip 变量的值: %d\n", *ip )
    로그인 후 복사

여러 슬라이스는 동일한 기본 레이어 배열을 재사용할 수 있습니다

type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}
로그인 후 복사

  • map
    • 在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型。
    • 其中K对应的key必须是支持==比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。虽然浮点数类型也是支持相等运算符比较的,但是将浮点数用做key类型则是一个坏的想法。
    • 对于V对应的value数据类型则没有任何的限制。
    创建map:
    1,
    内置的make函数可以创建一个map:
    
    ages := make(map[string]int) // mapping from strings to ints
    
    2,
    我们也可以用map字面值的语法创建map,同时还可以指定一些最初的key/value:
    
    ages := map[string]int{
        "alice":   31,
        "charlie": 34,
    }
    这相当于
    
    ages := make(map[string]int)
    ages["alice"] = 31
    ages["charlie"] = 34
    因此,另一种创建空的map的表达式是map[string]int{}。
    
    Map中的元素通过key对应的下标语法访问:
    ages["alice"] = 32
    
    delete(ages, "alice") // remove element ages["alice"]
    
    所有这些操作是安全的,即使这些元素不在map中也没有关系;
    如果一个查找失败将返回value类型对应的零值,例如,
    即使map中不存在“bob”下面的代码也可以正常工作,因为ages["bob"]失败时将返回0。
    ages["bob"] = ages["bob"] + 1 // happy birthday!
    
    遍历map
    
    for name, age := range ages {
        fmt.Printf("%s\t%d\n", name, age)
    }
    로그인 후 복사

    函数

    函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。

    func name(parameter-list) (result-list) {
        body
    }
    로그인 후 복사

    channel 通道

    • 如果说goroutine是Go语音程序的并发体的话,那么channels它们之间的通信机制。
    • 一个channels是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。
    • 每个channel都有一个特殊的类型,也就是channels可发送数据的类型。一个可以发送int类型数据的channel一般写为chan int。
    使用内置的make函数,我们可以创建一个channel:
    
    使用内置的make函数,我们可以创建一个channel:
    
    ch := make(chan int) // ch has type 'chan int'
    로그인 후 복사
    • 和map类似,channel也一个对应make创建的底层数据结构的引用

    • 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者何被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil。

    • 两个相同类型的channel可以使用==运算符比较。如果两个channel引用的是相通的对象,那么比较的结果为真。一个channel也可以和nil进行比较。

    接口类型

    接口

    • 接口类型是对其它类型行为的抽象和概括;因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力。

    • 很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的。

    • 也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必需的方法就足够了。

    • 这种设计可以让你创建一个新的接口类型满足已经存在的具体类型却不会去改变这些类型的定义;当我们使用的类型来自于不受我们控制的包时这种设计尤其有用。

    • 接口类型是一种抽象的类型。它不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合;它们只会展示出它们自己的方法。也就是说当你有看到一个接口类型的值时,你不知道它是什么,唯一知道的就是可以通过它的方法来做什么。

    【相关推荐:Go视频教程编程教学

    위 내용은 Go에는 몇 가지 데이터 유형이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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