go语言基础type关键字

 阅读大约需要2分钟

go语言基础type关键字

type关键字有如下几种用法:定义结构体,定义接口,类型别名,类型定义,类型查询

1. 定义结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合

type Person struct {
	Name string
	Age int
}
func main() {
	p:=Person{Name: "john",Age:18}
	fmt.Println(p)
}
2. 定义接口

接口是一组仅包含方法名、参数、返回值的未具体实现的方法的集合。

如果实现了接口的所有方法,则认为实现了该接口,无需在该类型上显示的添加声明。

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

type People interface {
	ReturnName() string
}

func (p Person) ReturnName() string {
	return p.Name
}
func main() {
	p := Person{Name: "john", Age: 18}
	fmt.Println(p)
	fmt.Println(p.ReturnName())

	var a People
	a = p
	name := a.ReturnName()
	fmt.Println(name)

}
3. 类型别名

使用类型别名定义出来的类型与原类型一样,即可以与原类型变量互相赋值,又拥有了原类型的所有方法集。 给string类型取一个别名,别名名称是name

type name=string

类型别名与类型定义不同之处在于,使用类型别名需要在别名和原类型之间加上赋值符号(=); 使用类型别名定义的类型与原类型等价,而使用类型定义出来的类型是一种新的类型。

package main

import "fmt"

type a=string
type b string

func getValueA(str a)  {
	fmt.Println(str)
}

func getValueB(str b)  {
	fmt.Println(str)
}
func main() {
	var str="Hello"
	getValueA(str)
	getValueB(str)
}

编译后提示 cannot use str (type string) as type b in argument to getValueB

4. 类型定义

类型定义可以在原类型的基础上创造出新的类型,有些场合下可以使代码更加简洁

package main

import "fmt"

// 将newInt定义为int类型
type newInt int

func main() {
	var a newInt
	a = 100
	fmt.Println(a)        // 100
	fmt.Printf("%T\n", a) // main.newInt
}

定义函数类型

package main

import "fmt"

type handle func(str string)

func exec(f handle)  {
	f("Hello")
}
func main() {
	p:= func(str string) {
		fmt.Println(str,"John")
	}
	exec(p)

	exec(func(str string) {
		fmt.Println(str,"World")
	})
}
5. 类型查询

类型查询,就是根据变量,查询这个变量的类型。

package main

import "fmt"

type Student struct {
	Name string
	Age  int
}

func main() {
	//var a interface{} = Student{Name: "John"}
	var a interface{} = "Hello"
	switch v := a.(type) {
	case string:
		fmt.Println("字符串")
	case int:
		fmt.Println("整型")
	default:
		fmt.Println("其他类型", v)
	}
}