Skip to content

go基础 #20

Open
Open
@isNeilLin

Description

@isNeilLin
  • array之间的赋值是值的赋值。即当把一个数组作为参数传入一个函数时,传入的是值的拷贝,而不是指针。如果要使用指针,需要使用slice类型。

  • Go语言中slice,map,channel这三种类型的实现机制类似指针,所以可以直接传递地址,而不用先取地址后传递。(若函数需要改变slice的长度,仍需要取地址传递指针)

  • new(T)分配零值填充的T类型的内存空间,并返回其地址(*T类型的值)。new返回指针

  • make(T, args)只能创建slice,map,channel,并且返回一个具有初始值的T类型,而不是*T。导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil。对于slicemapchannel来说,make初始化了内部的数据结构,填充适当的值。make返回初始化后的非零值

  • 当函数中有多个defer语句,这些defer语句会按照逆序执行。

  • 函数作为值、类型

package main

import "fmt"

type testInt func (int) bool    //声明了一个函数类型

func isOdd (i int) bool {
	if i % 2 == 0 {
		return false
	}
	return true
}

func isEven (i int) bool {
	if i % 2 == 0 {
		return true
	}
	return false
}

func filter (list []int, f testInt) []int  {
	var result []int
	for _, v := range list {
		if f(v) {
			append(result,v)
		}
	}
	return result
}

func main ()  {
	list := []int{1,2,3,4,5,6,7,8}
	odd := filter(list, isOdd)
	even := filter(list, isEven)
	fmt.Println("Odd elements: ", odd)
	fmt.Println("Even elements: ", even)
}
  • interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。任意的类型都实现了空interface。空interface可以存储任意类型的值
// 定义a为空接口
var a interface{}
var i int = 5
s := "hello"
// a可以存储任意类型的数值
a = i
a = s
  • channel默认为非缓存类型。Go也允许指定channel的缓存大小,就是channel可以存储多少元素。ch:= make(chan bool, 4),创建了可以存储4个元素的bool 型channel。在这个channel 中,前4个元素可以无阻塞的写入。当写入第5个元素时,代码将会阻塞,直到其他goroutine从channel 中读取一些元素,腾出空间。

  • 可以使用range像操作slicemap类型一样操作缓存类型channel

Metadata

Metadata

Assignees

No one assigned

    Labels

    服务端node,go等服务端语言

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions