Go基础(二) | 青训营笔记

92 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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循环条件不用括号