2018年7月
GoLand File->Settings->Editor->General->Appearance->Show parameter name hints
Go规定包声明中的包名是代码包路径的最后一个元素
go 关键字及分类
类别 关键字
程序声明 import,package
程序实体声明和定义 chan,const,func,interface,map,struct,type,var
程序流程控制 go,select,break,case,continue,default,defer,else,fallthrough,for,goto,if,range,return,switch
只要多个进程同时对同一个资源进行访问,就很可能互相干扰,这种干扰通常称为竞态条件(race condition)
执行过程中不能中断的操作称为原子操作(atomic operation)
而只能被串行化访问或执行的某个资源或某段代码称为临界区(critical section)
可以看到,原子操作和临界区这两个概念看起来有些相似.
但是,原子操作是不能中断的,而临界区对是否可以被中断却没有强制的规定,
只要保证一个访问者再临界区中时其他访问者不会被放进来就可以了.
这也意味着它们的强度是不同的.
保证只有一个进程或线程再临界区之内的做法有一个官方称谓-互斥(mutual exclusion,简称mutex).
实现互斥的方法必须确保排他原则(exclusion principle),并且这种保证不能依赖与任何计算机硬件(包括CPU)
如果有一个代码块,它可以被多个线程并发执行,且总能够产生预期的结果,那么该代码块就是线程安全的(thread-safe)
如果某个进程中的所有线程都可以并发地对一个函数进行调用,并且无论它们调用该函数的实际执行情况怎样,
该函数都可以产生预期的结果,那么就可以硕这个函数是可重入的(reentrant).如果某个进程中的所有线程都可以
并发地对一个函数进行调用,并且无论它们调用该函数的实际执行情况怎样,该函数都可以产生预期的结果,
那么就可以说这个函数是可重入的.
mgo(Rich MongoDB driver for Go)
MingW
#include <stdio.h> int myadd(int a, int b) { return a + b; }
all: test1.dll test1.dll: test1.o gcc -shared -o test1.dll test1.o test1.o: test1.c gcc -c test1.c
package main import ( "syscall" "fmt" ) func main() { addfile, err := syscall.LoadLibrary("test1.dll") //动态库的路径 if err != nil { fmt.Printf("cgo:err :%v\n", err) } myaddcall, _ := syscall.GetProcAddress(addfile, "myadd") var nargs uintptr = 3 ret, _, callErr := syscall.Syscall(uintptr(myaddcall), nargs, 5, 3, 0) if callErr != 0 { fmt.Printf("Call myaddcall: %v\n", callErr) } fmt.Printf("myadd:%v\n", ret) }
pacman -S mingw-w64-x86_64-toolchain
pacman -S base-devel
pacman -S msys-devel
pacman -Ss gcc
pacman -Syu
pacman -Su
gnatsd.exe
gnatsd -config ./go.conf -D
go.conf
#Cluster Seed Node
listen: 0.0.0.0:3222
http:3223
cluster {
listen: 0.0.0.0:8248
}
mongod --dbpath pathString