Golang
2021-02-22
- 创建临时文件
- 使用编辑器编辑
- 获取内容
- 删除临时文件
package main
import (
"bufio"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
)
func main() {
// create a tmp file
// ioutil.TempFile creates a temp file and opens the file for reading and writing
// and returns the resulting *os.File (file descriptor).
tmpFile, err := ioutil.TempFile(os.TempDir(), "todo-tmp-")
if err != nil {
log.Fatal("Cannot create temporary file", err)
}
// defer os.Remove(tmpFile.Name())
defer tmpFile.Close()
fmt.Println("Created File: " + tmpFile.Name())
// choose editor by env var
editor := os.Getenv("EDITOR")
args := []string{}
if editor == "" {
editor = "vim"
args = append(args, "--clean")
fmt.Println("No EDITOR enviroment variable set, use " + editor)
} else {
fmt.Println("Using EDITOR enviroment variable: " + editor)
}
args = append(args, tmpFile.Name())
fmt.Println("Opening file with " + editor + " with args: " + fmt.Sprint(args))
// check the editor command is available
// _, err = exec.LookPath(editor)
// if err != nil {
// log.Fatal("Cannot find editor: " + editor)
// }
// call the editor
cmd := exec.Command(editor, args...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
log.Fatal("Cannot run editor: " + editor)
}
// read the file
// data, err := ioutil.ReadFile(tmpFile.Name())
// if err != nil {
// log.Fatal("Cannot read file: " + tmpFile.Name())
// }
tmpFile.Seek(0, 0)
s := bufio.NewScanner(tmpFile)
for s.Scan() {
fmt.Println("Content:\n\n" + s.Text())
}
if err = s.Err(); err != nil {
log.Fatal("error reading temp file", err)
}
}
Golang GoStdLib
2021-02-21
func Clone(s string) string //
func Compare(a, b string) int // 比较
func Contains(s, substr string) bool // 包含子字符串
func ContainsAny(s, chars string) bool // 包含任意Char
func ContainsRune(s string, r rune) bool // 包含Rune
func Count(s, substr string) int // 计数
func Cut(s, sep string) (before, after string, found bool)
func EqualFold(s, t string) bool //
func Fields(s string) []string // 切割
func FieldsFunc(s string, f func(rune) bool) []string
func HasPrefix(s, prefix string) bool // 前缀判断 startswith
func HasSuffix(s, suffix string) bool // 后缀判断 endswith
func Index(s, substr string) int // 查找
func IndexAny(s, chars string) int // 查找Any
func IndexByte(s string, c byte) int // 查找Byte
func IndexFunc(s string, f func(rune) bool) int // 查找Func
func IndexRune(s string, r rune) int // 查找Rune
func Join(elems []string, sep string) string // 连接
func LastIndex(s, substr string) int // 右查找
func LastIndexAny(s, chars string) int // 右查找Any
func LastIndexByte(s string, c byte) int // 右查找Byte
func LastIndexFunc(s string, f func(rune) bool) int // 右查找Func
func Map(mapping func(rune) rune, s string) string //
func Repeat(s string, count int) string // 重复
func Replace(s, old, new string, n int) string // 替换
func ReplaceAll(s, old, new string) string // 替换 = Replace -1
func Split(s, sep string) []string // 切割
func SplitAfter(s, sep string) []string //
func SplitAfterN(s, sep string, n int) []string //
func SplitN(s, sep string, n int) []string //
func Title(s string) string //
func ToLower(s string) string // 转小写
func ToLowerSpecial(c unicode.SpecialCase, s string) string
func ToTitle(s string) string // Title
func ToTitleSpecial(c unicode.SpecialCase, s string) string
func ToUpper(s string) string
func ToUpperSpecial(c unicode.SpecialCase, s string) string
func ToValidUTF8(s, replacement string) string
func Trim(s, cutset string) string
func TrimFunc(s string, f func(rune) bool) string
func TrimLeft(s, cutset string) string
func TrimLeftFunc(s string, f func(rune) bool) string
func TrimPrefix(s, prefix string) string
func TrimRight(s, cutset string) string
func TrimRightFunc(s string, f func(rune) bool) string
func TrimSpace(s string) string
func TrimSuffix(s, suffix string) string
type Builder
func (b *Builder) Cap() int
func (b *Builder) Grow(n int)
func (b *Builder) Len() int
func (b *Builder) Reset()
func (b *Builder) String() string
func (b *Builder) Write(p []byte) (int, error)
func (b *Builder) WriteByte(c byte) error
func (b *Builder) WriteRune(r rune) (int, error)
func (b *Builder) WriteString(s string) (int, error)
type Reader
func NewReader(s string) *Reader
func (r *Reader) Len() int
func (r *Reader) Read(b []byte) (n int, err error)
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
func (r *Reader) ReadByte() (byte, error)
func (r *Reader) ReadRune() (ch rune, size int, err error)
func (r *Reader) Reset(s string)
func (r *Reader) Seek(offset int64, whence int) (int64, error)
func (r *Reader) Size() int64
func (r *Reader) UnreadByte() error
func (r *Reader) UnreadRune() error
func (r *Reader) WriteTo(w io.Writer) (n int64, err error)
type Replacer
func NewReplacer(oldnew ...string) *Replacer
func (r *Replacer) Replace(s string) string
func (r *Replacer) WriteString(w io.Writer, s string) (n int, err error)
Builder
Reader
Replacer
参考资料与拓展阅读
Python
2021-02-20

垃圾回收
Garbage Collector, 简写: GC
Python 垃圾回收是简单基于引用计数
弱引用
在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收。一些配有垃圾回收机制的语言,如Java、C#、Python、Perl、Lisp等都在不同程度上支持弱引用。
一句话:弱引用不增加计数,对引用计数型 GC 友好一些
垃圾回收与循环引用的问题
import gc
IDS = {}
class A:
def __del__(self):
_id = id(self)
print('A.__del__ %s: 0x%x' % (IDS[_id], _id))
OBJS = {i: A() for i in range(3)}
for i, obj in OBJS.items():
_id = id(obj)
IDS[_id] = f'OBJS[{i}]'
print('%s: 0x%x' % (IDS[_id], _id))
OBJS[1].attr = OBJS[1]
print('1' * 50)
print('====> del OBJS[0]')
del OBJS[0]
print('2' * 50)
print('====> del OBJS[1]')
del OBJS[1]
print('3' * 50)
print('====> del OBJS[2]')
del OBJS[2]
print('4' * 50)
gc.collect()
import weakref
print()
print('=' * 50)
class B:
def __init__(self, obj):
self.attrs = [obj]
def __del__(self):
_id = id(self)
print('B.__del__ %s: 0x%x' % (IDS[_id], _id))
a = A()
b = B(a)
a.xyz = b
IDS[id(a)] = 'a'
IDS[id(b)] = 'b'
del a, b # do nothing
print('=' * 40)
gc.collect() # will del a and b
print()
print('=' * 50)
class C:
def __init__(self, obj):
self.attrs = [weakref.ref(obj)]
def __del__(self):
_id = id(self)
print('C.__del__ %s: 0x%x' % (IDS[_id], _id))
a = A()
c = C(a)
a.xyz = c
IDS[id(a)] = 'a'
IDS[id(c)] = 'c'
del a, c
print('=' * 40)
gc.collect()
标准库:weakref
class weakref.ref(object[, callback])
回调
weakref.proxy(object[, callback])
weakref.getweakrefcount(object)
weakref.getweakrefs(object)
class weakref.WeakKeyDictionary([dict])
.keyrefs()
class weakref.WeakValueDictionary([dict])
.valuerefs()
class weakref.WeakSet([elements])
Set class that keeps weak references to its elements. An element will be discarded when no strong reference to it exists any more.
class weakref.WeakMethod(method)
class weakref.finalize(obj, func, /, *args, **kwargs)
weakref.ReferenceType
weakref.ProxyType
weakref.CallableProxyType
weakref.ProxyTypes
import weakref
class Klass:
pass
obj = Klass()
ref = weakref.ref(obj)
print(ref())
del obj
print(ref()) # None
obj = Klass()
p = weakref.proxy(obj)
print(p)
del obj
print(p) # ReferenceError: weakly-referenced object no longer exists
参考资料与拓展阅读
个人 育儿 政策
2021-02-17
参考《国家学生体质健康标准(2014年修订)》,主要看看 90 分的要求。
Golang GoStdLib GoReflect
2021-02-17
func Copy(dst, src Value) int
func DeepEqual(x, y any) bool
func Swapper(slice any) func(i, j int)
type ChanDir
func (d ChanDir) String() string
type Kind
func (k Kind) String() string
type MapIter
func (iter *MapIter) Key() Value
func (iter *MapIter) Next() bool
func (iter *MapIter) Reset(v Value)
func (iter *MapIter) Value() Value
type Method
func (m Method) IsExported() bool
type SelectCase
type SelectDir
type SliceHeader
type StringHeader
type StructField
func VisibleFields(t Type) []StructField
func (f StructField) IsExported() bool
type StructTag
func (tag StructTag) Get(key string) string
func (tag StructTag) Lookup(key string) (value string, ok bool)
Type
func ArrayOf(length int, elem Type) Type
func ChanOf(dir ChanDir, t Type) Type
func FuncOf(in, out []Type, variadic bool) Type
func MapOf(key, elem Type) Type
func PointerTo(t Type) Type
func PtrTo(t Type) Type
func SliceOf(t Type) Type
func StructOf(fields []StructField) Type
func TypeOf(i any) Type
Value
func Append(s Value, x ...Value) Value
func AppendSlice(s, t Value) Value
func Indirect(v Value) Value
func MakeChan(typ Type, buffer int) Value
func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value
func MakeMap(typ Type) Value
func MakeMapWithSize(typ Type, n int) Value
func MakeSlice(typ Type, len, cap int) Value
func New(typ Type) Value
func NewAt(typ Type, p unsafe.Pointer) Value
func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
func ValueOf(i any) Value
func Zero(typ Type) Value
func (v Value) Addr() Value
func (v Value) Bool() bool
func (v Value) Bytes() []byte
func (v Value) Call(in []Value) []Value
func (v Value) CallSlice(in []Value) []Value
func (v Value) CanAddr() bool
func (v Value) CanComplex() bool
func (v Value) CanConvert(t Type) bool
func (v Value) CanFloat() bool
func (v Value) CanInt() bool
func (v Value) CanInterface() bool
func (v Value) CanSet() bool
func (v Value) CanUint() bool
func (v Value) Cap() int
func (v Value) Close()
func (v Value) Comparable() bool
func (v Value) Complex() complex128
func (v Value) Convert(t Type) Value
func (v Value) Elem() Value
func (v Value) Equal(u Value) bool
func (v Value) Field(i int) Value
func (v Value) FieldByIndex(index []int) Value
func (v Value) FieldByIndexErr(index []int) (Value, error)
func (v Value) FieldByName(name string) Value
func (v Value) FieldByNameFunc(match func(string) bool) Value
func (v Value) Float() float64
func (v Value) Grow(n int)
func (v Value) Index(i int) Value
func (v Value) Int() int64
func (v Value) Interface() (i any)
func (v Value) InterfaceData() [2]uintptrDEPRECATED
func (v Value) IsNil() bool
func (v Value) IsValid() bool
func (v Value) IsZero() bool
func (v Value) Kind() Kind
func (v Value) Len() int
func (v Value) MapIndex(key Value) Value
func (v Value) MapKeys() []Value
func (v Value) MapRange() *MapIter
func (v Value) Method(i int) Value
func (v Value) MethodByName(name string) Value
func (v Value) NumField() int
func (v Value) NumMethod() int
func (v Value) OverflowComplex(x complex128) bool
func (v Value) OverflowFloat(x float64) bool
func (v Value) OverflowInt(x int64) bool
func (v Value) OverflowUint(x uint64) bool
func (v Value) Pointer() uintptr
func (v Value) Recv() (x Value, ok bool)
func (v Value) Send(x Value)
func (v Value) Set(x Value)
func (v Value) SetBool(x bool)
func (v Value) SetBytes(x []byte)
func (v Value) SetCap(n int)
func (v Value) SetComplex(x complex128)
func (v Value) SetFloat(x float64)
func (v Value) SetInt(x int64)
func (v Value) SetIterKey(iter *MapIter)
func (v Value) SetIterValue(iter *MapIter)
func (v Value) SetLen(n int)
func (v Value) SetMapIndex(key, elem Value)
func (v Value) SetPointer(x unsafe.Pointer)
func (v Value) SetString(x string)
func (v Value) SetUint(x uint64)
func (v Value) SetZero()
func (v Value) Slice(i, j int) Value
func (v Value) Slice3(i, j, k int) Value
func (v Value) String() string
func (v Value) TryRecv() (x Value, ok bool)
func (v Value) TrySend(x Value) bool
func (v Value) Type() Type
func (v Value) Uint() uint64
func (v Value) UnsafeAddr() uintptr
func (v Value) UnsafePointer() unsafe.Pointer
Golang
2021-02-16
Golang os
包 中有很多文件系统相关的操作。
创建文件
// *os.File
file, err = os.Create("abc.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
删除文件
os.Remove()
读写文件
// ioutil
func ReadFile(filename string) ([]byte, error)
func WriteFile(filename string, data []byte, perm os.FileMode) error
// os
func Open(name string) (*File, error)
func OpenFile(name string, flag int, perm FileMode) (*File, error)
func ReadFileToString(filename string) ([]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
var data []string
for scanner.Scan() {
line := scanner.Text()
data = append(data, line)
}
if err = scanner.Err(); err != nil {
return nil, err
}
return data, nil
}
// 写
// 如果文件大于指定大小,则截断到指定大小
// 如果文件小于指定大小,则填充到指定大小
file, err := os.Truncate("abc.txt", 1024)
if err != nil {
log.Fatal(err)
}
裁剪文件(Truncate)
file, err := os.OpenFile("abc.txt", os.O_RDWR, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
err := file.Truncate(1024)
if err != nil {
log.Fatal(err)
}
// os.Truncate(path string, size int64) error
err := os.Truncate("abc.txt", 1024)
if err != nil {
fmt.Println("截断文件失败:", err)
}
创建目录(mkdir)
err := os.Mkdir(dirName, 0755) // 不能创建已经存在的目录
// err := os.MkdirAll(dirPath, 0755) // mkdir -p
if err != nil {
fmt.Println("创建目录失败:", err)
return
}
删除目录(rm)
err := os.Remove(dirName) // 不能删除非空目录
// err := os.RemoveAll(dirName) // rm -rf
if err != nil {
fmt.Println("删除目录失败:", err)
return
}
查看目录(List/Walk)
dirEntries, err := os.ReadDir(dirPath)
if err != nil {
return err
}
for _, entry := range dirEntries {
entryPath := filepath.Join(dirPath, entry.Name())
if entry.IsDir() {
fmt.Println("目录:", entryPath)
} else {
fmt.Println("文件:", entryPath)
}
}
package main
import (
"fmt"
"os"
"path/filepath"
)
func visit(path string, info os.FileInfo, err error) error {
if err != nil {
fmt.Println("访问目录失败:", err)
return nil
}
if info.IsDir() {
fmt.Println("目录:", path)
} else {
fmt.Println("文件:", path)
}
return nil
}
func main() {
dirPath := "/path/to/directory"
err := filepath.Walk(dirPath, visit)
if err != nil {
fmt.Println("遍历目录失败:", err)
return
}
}
查看文件信息(Stat)
fp.Stat() // 句柄上执行 Stat 方法
fi, err = os.Stat(filepath)
// type FileInfo interface {
// Name() string // base name of the file
// Size() int64 // length in bytes for regular files; system-dependent for others
// Mode() FileMode // file mode bits
// ModTime() time.Time // modification time
// IsDir() bool // abbreviation for Mode().IsDir()
// Sys() any // underlying data source (can return nil)
// }
// FileMode -> fs.FileMode -> type FileMode uint32
// func (m FileMode) IsDir() bool
// func (m FileMode) IsRegular() bool
// func (m FileMode) Perm() FileMode
// func (m FileMode) String() string
// func (m FileMode) Type() FileMode
// const (
// // The single letters are the abbreviations
// // used by the String method's formatting.
// ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory
// ModeAppend // a: append-only
// ModeExclusive // l: exclusive use
// ModeTemporary // T: temporary file; Plan 9 only
// ModeSymlink // L: symbolic link
// ModeDevice // D: device file
// ModeNamedPipe // p: named pipe (FIFO)
// ModeSocket // S: Unix domain socket
// ModeSetuid // u: setuid
// ModeSetgid // g: setgid
// ModeCharDevice // c: Unix character device, when ModeDevice is set
// ModeSticky // t: sticky
// ModeIrregular // ?: non-regular file; nothing else is known about this file
// // Mask for the type bits. For regular files, none will be set.
// ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice | ModeCharDevice | ModeIrregular
// ModePerm FileMode = 0777 // Unix permission bits
// )
// is exists
func IsNotExist(err error) bool
// 注意:这个方法只有在出现异常,并且异常是路径已存在导致的,才会返回 True
func IsExist(err error) bool
// is dir
if fi.IsDir() {
...
}
// is file
if fi.Mode().IsRegular() {
...
}
// readable
// writable
// executable
移动文件
os.Rename(src, dst)
复制文件
sourceFile, err := os.Open(sourceFilePath)
if err != nil {
return err
}
defer sourceFile.Close()
destinationFile, err := os.Create(destinationFilePath)
if err != nil {
return err
}
defer destinationFile.Close()
_, err = io.Copy(destinationFile, sourceFile)
创建链接
os.Link()
os.Symlink()
临时目录和临时文件
tempFile, err := os.CreateTemp("", "tmp*.txt") // *os.File
tempFilePath := tempFile.Name()
tempDir, err := os.MkdirTemp("", "tmp") // string
权限
fp.Chmod()
fp.Chown() // os.Getuid(), os.Getgid()
开发工具 Windows
2021-02-14
Windows CMD 太挫,中文字体选择少,XP, Win7 下只有点阵字体 (fixedsys) 和新宋体,Win10 字体又多了几个,但效果页不太好。
不过 Win10 的话,可能是半年前吧,微软新出来了一个 Windows Terminal 的虚拟终端,就现代化多了。现在我在 Windows 下(偶尔)一般都是用的新版 Terminal + PowerShell,听方便。
但如果由于 OS 版本等问题,离不开 cmd 的话,有两个方法,一个是使用第三方终端模拟器,比如 cmder;再一个就是想办法定制一下 cmd 的字体。
我在这里记录一下之前使用的一个方案失效地址(确认有效,不过好久都没有用了)。
Golang GoStdLib
2021-02-14
io
, io/fs
, io/util
, os
find /usr/share/go-1.17/src/io/ -type f | grep -Fv _test.go
/usr/share/go-1.17/src/io/ioutil/testdata/hello
/usr/share/go-1.17/src/io/ioutil/tempfile.go
/usr/share/go-1.17/src/io/ioutil/ioutil.go
/usr/share/go-1.17/src/io/pipe.go
/usr/share/go-1.17/src/io/fs/fs.go
/usr/share/go-1.17/src/io/fs/readfile.go
/usr/share/go-1.17/src/io/fs/readdir.go
/usr/share/go-1.17/src/io/fs/sub.go
/usr/share/go-1.17/src/io/fs/stat.go
/usr/share/go-1.17/src/io/fs/walk.go
/usr/share/go-1.17/src/io/fs/glob.go
/usr/share/go-1.17/src/io/io.go
/usr/share/go-1.17/src/io/multi.go
方法
https://pkg.go.dev/io
相关方法
io.Reader
/ io.Writer
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
strings
、bytes
、bufio
、os.File
都是 io.Reader
的实现。
小技巧:利用类型断言检查是否实现指定接口
https://stackoverflow.com/a/25677274
var _ io.Reader = (*os.File)(nil)
// nil 可以转换成任意类型的空指针
// 这里将 nil 转换成 os.File 指针,再赋值给 io.Reader 类型
io/fs
包
func Glob(fsys FS, pattern string) (matches []string, err error)
func ReadFile(fsys FS, name string) ([]byte, error)
func ValidPath(name string) bool
func WalkDir(fsys FS, root string, fn WalkDirFunc) error
io/util
包 (原 ioutil
)
1.6 以及之后新版本,iouitl 包依然保留,但是只是对 io 包的封装。
Package ioutil implements some I/O utility functions.
As of Go 1.16, the same functionality is now provided by package io or package os, and those implementations should be preferred in new code. See the specific function documentation for details.
func NopCloser(r io.Reader) io.ReadCloser
func ReadAll(r io.Reader) ([]byte, error)
func ReadDir(dirname string) ([]fs.FileInfo, error)
func ReadFile(filename string) ([]byte, error)
func TempDir(dir, pattern string) (name string, err error)
func TempFile(dir, pattern string) (f *os.File, err error)
func WriteFile(filename string, data []byte, perm fs.FileMode) error
// grep -REv "^//" /usr/share/go-1.17/src/io/ioutil/tempfile.go
package ioutil
import (
"os"
)
func TempFile(dir, pattern string) (f *os.File, err error) {
return os.CreateTemp(dir, pattern)
}
func TempDir(dir, pattern string) (name string, err error) {
return os.MkdirTemp(dir, pattern)
}
// grep -REv "^//" /usr/share/go-1.17/src/io/ioutil/ioutil.go
package ioutil
import (
"io"
"io/fs"
"os"
"sort"
)
func ReadAll(r io.Reader) ([]byte, error) {
return io.ReadAll(r)
}
func ReadFile(filename string) ([]byte, error) {
return os.ReadFile(filename)
}
func WriteFile(filename string, data []byte, perm fs.FileMode) error {
return os.WriteFile(filename, data, perm)
}
func ReadDir(dirname string) ([]fs.FileInfo, error) {
f, err := os.Open(dirname)
if err != nil {
return nil, err
}
list, err := f.Readdir(-1)
f.Close()
if err != nil {
return nil, err
}
sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
return list, nil
}
func NopCloser(r io.Reader) io.ReadCloser {
return io.NopCloser(r)
}
var Discard io.Writer = io.Discard
引申
io
包是基础,提供了 Reader 和 Writer 接口。其他包则是实现这两个接口。
string
包:字符串 IO
相当于 Python io.StringIO
bytes
包:字节 IO
通过 []byte
模拟 io,相当于 Python io.BytesIO
bytes.Buffer
(Reader + Writer)
bytes.Reader
buffio
包:缓冲 IO
就是加入了一个缓冲的功能,提升 IO 效率,减少直接系统调用。
也方便实现一些网络协议中的分包,比如 SMTP 协议中按换行切割。
bufio.Reader
bufio.Writer
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("test.txt")
if err != nil {
fmt.Println("无法打开文件:", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err != nil {
// 文件结束或发生错误
break
}
fmt.Print(line)
}
}
os
包:系统 IO
func Open(name string) (*File, error)
func OpenFile(name string, flag int, perm FileMode) (*File, error)
var Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
var Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
var Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
net
包:网络 IO
网络编程的部分,这里就不继续展开了。
func Pipe() (Conn, Conn)
func Dial(network, address string) (Conn, error)
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
func FileConn(f *os.File) (c Conn, err error)
func (d *Dialer) Dial(network, address string) (Conn, error)
func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error)
func FilePacketConn(f *os.File) (c PacketConn, err error)
func ListenPacket(network, address string) (PacketConn, error)
func DialIP(network string, laddr, raddr *IPAddr) (*IPConn, error)
func ListenIP(network string, laddr *IPAddr) (*IPConn, error)
func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error)
func (l *TCPListener) Accept() (Conn, error)
func (l *TCPListener) AcceptTCP() (*TCPConn, error)
func DialUDP(network string, laddr, raddr *UDPAddr) (*UDPConn, error)
func ListenMulticastUDP(network string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, error)
func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error)
func DialUnix(network string, laddr, raddr *UnixAddr) (*UnixConn, error)
func ListenUnixgram(network string, laddr *UnixAddr) (*UnixConn, error)
func (l *UnixListener) Accept() (Conn, error)
func (l *UnixListener) AcceptUnix() (*UnixConn, error)
阅读 日本
2021-02-13
不少留学生在国内都是受人尊重的秀才举人,而到了日本却发现自己竟然要被底层的劳力阶层嘲笑。
作者系武汉历史文化学者,原文来自《证券时报》
阅读 历史 古文
2021-02-12
在网易云音乐中听《软件那些事》聊这篇文章聊了好多期,我也想说一说,不吐不快。
PS: 我有点看不惯那家伙的一些做派,所以就听了一期还是两期,可能《报任安书》还远没有讲完。
PS: 如果抛去上面说的这点,听的士司机(他自己说的)闲聊还是挺有意思。