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)
}
}