Let's GO(三)

摘要:
您可以使用gofmt完成代码格式化ageint8}//1。定义varp1person1。name=“”//2.定义并分配p2:20}//3。varp3=新(人)//p3:

人生苦短,Let's GO

今天我学了什么?

1. 结构体(struct)

/*
type TYPENAME struct {
name type
...
}
*/

type person struct { 
	name, city string  //这里上下类型的位置最好对上,可以使用go fmt完成代码格式化
	age               int8
}
//1.定义
var p1 person
p1.name = ""
...
//2.定义并赋值
p2 := person{
	name: " "   //name:可以略去,此时必须初始化所有字段且与定义顺序一致
	city: ""
	age:20
}
//3.
var p3 = new(person) //p3:=&person{}
(*p3).name = ""
p3.city="" //可以直接调用指针结构体中的字段

匿名类

var user struct {
		name string
		age  int
}
user.name = "Joko"
user.age = 80
fmt.Printf("p1:%#v
", user)

2、方法(Method)和 接收者

方法就是类内函数,也不知道go是怎么神奇的将零散的方法整合成一个大结构
接收者是一个我没听说过的概念,学习之后感觉作用类似与this指针

//构造函数,习惯上命名为NewStructName
func NewPerson(name string,age int) *Person  { 
	return &Person{
		name:name,
		age:age,
	}
}
//(p Person)就是接收者啦,惯例取类第一个字母小写为名,这里是值接收者
func (p Person) Dream()  {
	fmt.Printf("%s is dreaming
",p.name)
}

//指针接收者在修改内部数据上更有优势(自己声明的this)
func (p *Person) SetAge(age int) {
	p.age = age
}

3. 组合与继承

Go的官方回应Go是否为面对对象语言时表示yes and no,
yes :Go 具备很多面对对象的特性
no:但Go又不像C++或Java那么强硬的封装

type Address struct {
	city string
}

type Person2 struct {
	name string
	age int
	Address //Address类以匿名类形式进行组合
}

p2 := Person2{
		name:    "JOKO",
		age:     10,
		Address: Address{"hk"},
	}
fmt.Printf("%#v
",p2)
fmt.Println(p2.city)  //直接访问匿名结构体字段,前提是不存在字段冲突
//如果不使用匿名类调用方式:p2.Address.city
type Animal struct {
	name string
}

func (a *Animal) move() {
	fmt.Printf("%s move",a.name)
}

type Dog struct {
	feet int
	*Animal
}

func (d *Dog) wang()  {
	fmt.Printf("%s www",d.name)
}

d.wang()
d.move()

继承与多态,但是没有任何明确的说继承这个字眼

4.接口(interface)

接口其他都不管,就认方法,实现方法就是实现了接口。

type sayer interface {
	say()
}
func (p Person) say() {
	fmt.Println("Hi")
}
//实现接口
func sayHi(arg sayer)  {
	arg.say()
}
type Sayer interface {
	say()
}

//实现多个接口
type Runer interface {
	run()
}

//接口嵌套
type animal interface {
	Sayer
	Runer
}

空接口 interface{}
神奇的一个东西:任何类型都实现空接口,所以空接口可以存储任意类型值
这是Go的泛型?

type xxx interface {
}
var x interface{}  //直接声明空接口变量x
x = "Hello"        //x 可以实现任意变量
fmt.Println(x)
x = 123
fmt.Println(x)
x = false
fmt.Println(x)

var m = make(map[string]interface{},16)
m["name"] = "Pallava"
m["age"] = 18
m["hobby"] = []string{"sing","jump","rap"}
fmt.Println(m)
//断言:判断空接口存的值的类型
ret,ok:= x.(bool)
if !ok {
	fmt.Println("not bool")
} else {
	fmt.Println("is bool",ret)
}
总结:

很明显,Go的语言出乎意料的精炼高效,像开发python一样愉快的开发C++般功能的项目。
希望Go越来越强大(后浪!)
那么朋友,人生苦短,Let's GO!

免责声明:文章转载自《Let's GO(三)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一起学CC3200之开发环境简介(2)烧录程序lua 函数调用1 -- 闭包详解和C调用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

wpf简单进度条

UserControl x:Class="WpfApplication1.UserControl2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:...

[OpenCVsharp]利用指针实现高速访问像素RGB值

先简单介绍下什么是OpenCVsharp,内容取自百度百科 OpenCvSharp是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。该库采用LGPL发行,对商业应用友好。使用OpenCvSharp,可用C#,VB.NET等语言实现多种流行的图像处理(image...

TestNG使用教程详解(接口测试用例编写与断言)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/sinat_34766121/article/details/89084983GitHub: https://github.com/reese0329/testng 接口测试用例编写Testng使用...

Repeater的Command操作

Repeater的Command操作 1、ItemCommand事件 :在Repeater中所有能触发事件的控件,都会来触发这一个事件 后台创建:在Page_Load中 Repeater1.ItemCommand += ,然后双击Tab键创建 2、CommandName : 判断点击的是什么按钮, 后台调用:e.CommandName 3、CommandAr...

Linux设置和查看环境变量的方法

1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ echo $HELLO Hello! 3. 使用env命令显示所有的环境变量 $ env HOSTNAME=redbooks.safe.org PVM_RS...

迅为瑞芯微3399开发板Debian系统双屏异显,双屏同显测试

本文主要介绍了 RockChip linux 在 Debian 平台上支持的双屏异显和双屏同显测试。1、首先烧写光盘资料里面的 Debian 镜像-update.img。作者测试使用的是 LVDS9.7 寸屏幕(LVDS7 寸屏,LVDS10.1 寸屏,MIPI 7 寸屏也支持)和 HDMI 屏幕。LVDS9.7 寸屏幕使用转接板连接,HDMI 屏幕使用配...