这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
GO基础(二)
结构体
声明结构体
定义一个结构体类型,这需要使用type和struct,type用于设定结构体的名称,struct用于定义一个新的数据类型。
type struct_variable_type struct {
member definition
member definition
}
声明结构体变量
variable_name := struct_variable_type{value1,value2}
variable_name := struct_variable_type{key1:value1,key2:value2}
访问成员变量
操作格式为:结构体变量名.成员名
package main
import "fmt"
type User struct {
username string
password string
}
func main() {
var user User;
user.username = "张三"
user.password = "lisi"
}
结构体指针
定义一个结构体变量和初始化
var struct_pointer *User
struct_pointer = &user
访问成员变量
但是和c语言中有所不同,使用结构体指针访问结构体成员仍然使用.操作符。格式如下:struct_pointer.title
行为定义
1.第一种定义方法在实例对应方法被调用时,实例的成员会进行值的复制
func(e Employee) String() string{
return e.username,e.password
}
2.通常情况为了避免内存拷贝通常使用第二种定义方式
func(e *Employee) String string{
return e.username,e.password
}
函数
函数分类
1.具体函数
具体函数值 具有函数名,返回值,以及函数参数的函数。
func add(a,b,int) int{
return a+b
}
//第一个int为参数类型,第二个int为返回值类型
2.匿名函数
匿名函数指不需要函数名的一种函数实现方式。
var add = func(a,b,int)int {
return a+b
}
可变参数函数
func Sum(ops ...int) int {
ret := 0
for _, op := range ops {
ret += op
}
return ret
}
t.Log(Sum(1, 2, 3, 4))
t.Log(Sum(1, 2, 3, 4, 5))
defer函数
在程序结束前最后执行的函数,通常用来释放资源,在程序异常时也会执行
package Test
import "testing"
func TestDefer(t *testing.T) {
defer func() {
t.Log("clear resource")
}()
t.Log("Started")
panic("Fatal error")
}
差异
1.可以有多个返回值
2.所有参数都是值传递
3.函数可以作为变量的值
4.函数可以作为参数和返回值
接口
package Test
import "testing"
// 定义一个接口
type Programmer interface {
WriteHelloWorld() string
}
type GoProgrammer struct {
}
func (g *GoProgrammer) WriteHelloWorld() string {
return "fmt.println("Hello World")"
}
func TestClient(t *testing.T) {
var p Programmer
p = new(GoProgrammer)
t.Log(p.WriteHelloWorld())
}
接口差异
1.接口为非侵入性,实现不依赖于接口定义
2.所以接口的定义可以包含在接口使用者包内
与其他语言的区别
1.不支持强制类型转换
2.不支持指针运算
3.string是值类型,默认的初始化为空字符串,并不是nil
4.for循环条件不用括号