go言語入門

5733 ワード

記事1、記事2を参照
1.コンパイル
go build test.go

2.運転
go run test.go

3.ヘルプを見る
go doc builtin
go doc fmt/fnv
4.テストの実行
ソースコードevenを記述する.go
/*
	this package is test for write package

*/
package even

// check value is even value
// if is even, return true, otherwise false	
func Even(value int) bool {
	return 0 == (value % 2)
}

func Odd(value int) bool {
	return 1 == (value % 2)
}
テストコードeven_の作成test.go
package even

import (
	"testing"
)

func TestEvent(t *testing.T) {
	if !Even(2) {
		t.Log("2 should be odd")
		t.Fail()
	}
}

func TestOdd(t *testing.T) {
	if !Odd(3) {
		t.Log("3 should be odd")
		t.Fail()
	}
}
実行テスト
go test

5.パッケージの作成
ソースファイルを作成し、$GOROOTの下のsrcpkgutilsustackmディレクトリの下にファイルustackを作成します.go
/**
   simulate stack, capacity is 10
**/
package ustack

import (
	"errors"
	strConvUtils "strconv"
)

const stackMax = 10

type UStack struct {
	index int
	datas [stackMax]int
}

func (s *UStack) Push(value int) (result int, err error) {
	if s.index > (stackMax - 1) {
		result = -1
		err = errors.New("exceed max size")
		return
	}
	s.datas[s.index] = value
	result = s.index
	s.index++
	return
}

func (s *UStack) Pop() (result int, err error) {
	if s.index < 1 {
		result = -2
		err = errors.New("exceed min size")
		return
	}
	result = s.datas[s.index-1]
	s.index--
	return
}

func (s *UStack) String() (str string) {
	for i := 0; i < s.index; i++ {
		str = str + "[" + strConvUtils.Itoa(i) + ":" + strConvUtils.Itoa(s.datas[i]) + "]"
	}
	return
}
パッケージ内の関数とタイプが外部にアクセスできることに注意してください.名前の最初の文字は大文字でなければなりません.
go build ustack.go
go install
ustack.a$GOROOT下のpkgwindows_386utilsustackディレクトリまたはpkglinux_386\utils\ustack
パッケージの作成方法別の方法
記事3、記事4を参照
環境変数にGOPATHを加え、対応するパッケージディレクトリ(複数のディレクトリがあり得る)を指定し、以下にパッケージのディレクトリとしてsrcディレクトリを作成する
上記の例のsrcustackUStackのような対応するgoファイルを作成します.go
任意のディレクトリで実行
go install ustack
対応するgopathディレクトリの下で自動的にpkgディレクトリを生成する
6.インタフェースの書き方
type IFactory interface {
	getRunApp() IRunApp
}

type AppTools struct {
	m_Factory FactoryImpl
}

type IRunApp interface {
	run()
}

type RunAppImpl struct {

}

type FactoryImpl struct {
	m_RunApp RunAppImpl
}


func (factory *FactoryImpl) getRunApp() IRunApp {
	return &factory.m_RunApp
}

func (runApp *RunAppImpl) run() {
}

func (appTools *AppTools) getFactory() IFactory {
	return &appTools.m_Factory
}

7リンクのコンパイル
8g 123.go
8l -o 123.out 123.8

8オペレーティングシステムディレクトリ区切り文字の取得
filepath.Separator

9ファイルまたはディレクトリが存在するかどうかを判断する
func (appTools *AppTools) pathExists(pathName string) bool {
	if appTools.judgeEmptyStr(&pathName) {
		return false
	}
	_, err := ioutil.ReadDir(pathName)
	if nil != err {
		return false
	}
	return true
}

func (appTools *AppTools) fileExists(fileName string) bool {
	f, err := os.Open(fileName)
	if err != nil && os.IsNotExist(err) {
		return false
	}
	defer f.Close()
	return true
}

10.取得日
func (appTools *AppTools) getCurrentTime() string {
	return time.Now().Format("2006-01-02 15:04:05")
}

11.文字列を小文字に変換
strings.ToLower

12.コピーファイル関数
func (appTools *AppTools) copyFile(src, dst string) bool {
	srcFile, err := os.Open(src)
	if err != nil {
		appTools.log(fmt.Sprintln("Open", src, "failed", err.Error()))
		return false
	}
	defer srcFile.Close()

	dstFile, err := os.Create(dst)

	if err != nil {
		appTools.log(fmt.Sprintln("create", dst, "failed", err.Error()))
		return false
	}

	defer dstFile.Close()
	w, err := io.Copy(dstFile, srcFile)
	w = w + 1
	if nil != err {
		appTools.log(fmt.Sprintln("Copy", src, "to", dst, "failed", err.Error()))
		return false
	}

	return true
}

13.文字列の切り取り
func (appTools *AppTools) substr(str string, start, count int) string {
	rs := []rune(str)
	rl := len(rs)
	end := 0

	if start < 0 {
		start = 0
	}

	if start > rl {
		return ""
	}
	if start < 0 {
		start = 0
	}
	if start > rl {
		start = rl
	}
	end = start + count
	if end > rl-1 {
		end = rl
	}
	return string(rs[start:end])
}

14.ファイルの読み書き
    srcFile, err := os.OpenFile(hName, os.O_RDONLY, 0666)
	if nil != err {
		appTools.log(fmt.Sprintln("file", hName, "open failed", err.Error()))
		return
	}
	defer srcFile.Close()
	tempFile, err := os.OpenFile(tempFileName, os.O_APPEND|os.O_RDWR, 0666)
	if nil != err {
		appTools.log(fmt.Sprintln("file", tempFileName, "open failed", err.Error()))
		return
	}
	defer tempFile.Close()
	srcReader := bufio.NewReader(srcFile)
	destWriter := bufio.NewWriter(tempFile)
	defer destWriter.Flush()
	for {
			str, err := srcReader.ReadString('
') if nil != err { if io.EOF != err { appTools.log(err.Error()) } break } _, err = destWriter.WriteString(str) if nil != err { appTools.log(err.Error()) } } }

15.文字列にサブ文字列を含む
//  
strings.Contains(str, substr)
//  
strings.HasSuffix(str, substr)
//  
strings.HasPrefix(str, substr)