Go言語の基本
内蔵タイプ
値のタイプ:
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array -- 固定长度的数组
参照型:(ポインタ型)
slice -- 序列数组(最常用)
map -- 映射
chan -- 管道
組み込み関数
- make(): 新しいスライス、マップ、またはチャネルを作成するために使用されます。make() 関数のパラメータには、作成するタイプ、長さ、容量が含まれます。
// 创建一个长度为5,容量为10的slice s := make([]int, 5, 10) fmt.Println(len(s)) // 5 fmt.Println(cap(s)) // 10 // 创建一个长度为5,容量为5的map m := make(map[string]int, 5) m["one"] = 1 fmt.Println(m) // map[one:1] // 创建一个容量为10的channel c := make(chan int, 10) c <- 1 fmt.Println(<-c) // 1
- append(): 要素をスライスに追加するために使用されます。スライスの容量が足りない場合は、append()関数により自動的に容量が拡張されます。
// 向slice中添加元素 s := []int{ 1, 2, 3} s = append(s, 4, 5, 6) fmt.Println(s) // [1 2 3 4 5 6]
- len(): スライス、マップ、文字列、配列、チャネルの長さを取得するために使用されます。
s := []int{ 1, 2, 3, 4, 5} fmt.Println(len(s)) // 5 m := map[string]int{ "one": 1, "two": 2, "three": 3} fmt.Println(len(m)) // 3 str := "hello" fmt.Println(len(str)) // 5 arr := [5]int{ 1, 2, 3, 4, 5} fmt.Println(len(arr)) // 5 c := make(chan int, 10) c <- 1 fmt.Println(len(c)) // 1
- cap(): スライス、配列、チャネルの容量を取得するために使用されます。
s := []int{ 1, 2, 3, 4, 5} fmt.Println(cap(s)) // 5 arr := [5]int{ 1, 2, 3, 4, 5} fmt.Println(cap(arr)) // 5 c := make(chan int, 10) fmt.Println(cap(c)) // 10
- copy(): スライス内の要素を別のスライスにコピーするために使用されます。
s1 := []int{ 1, 2, 3, 4, 5} s2 := make([]int, len(s1)) copy(s2, s1) fmt.Println(s2) // [1 2 3 4 5]
- close(): チャネルを閉じるために使用されます。
c := make(chan int, 10) c <- 1 close(c) fmt.Println(<-c) // 1 _, ok := <-c fmt.Println(ok) // false
- delete(): マップ内の要素を削除するために使用されます。
m := map[string]int{ "one": 1, "two": 2, "three": 3} delete(m, "two") fmt.Println(m) // map[one:1 three:3]
- Panic() および Recovery(): Go 言語で例外を処理するために使用されます。
これは、func test() { defer func() { if err := recover(); err != nil { fmt.Println("panic:", err) } }() panic("test panic") } func main() { test() fmt.Println("after test") } // 输出:panic: test panic
test()
function 内で関数が呼び出されpanic()
、プログラム内で例外が発生し、そのdefer
例外がステートメント内の匿名関数によってキャッチされて処理されるためです。具体的には、defer
ステートメントは匿名関数を関数呼び出しスタックにプッシュし、現在の関数が実行されるのを待ってから匿名関数を実行します。この例では、匿名関数で関数を使用してrecover()
例外をキャッチし、例外情報をコンソールに出力します。recover()
関数はdefer
ステートメント内でのみ有効となるため、defer
ステートメント内に配置する必要があります。最後に、main()
関数は実行を継続し、 を出力しますafter test
。 - print() および println(): コンテンツを端末に出力するために使用されます。
name := "Alice" age := 20 fmt.Print("My name is ", name, ", and I'm ", age, " years old.") // 输出:My name is Alice, and I'm 20 years old. fmt.Println("My name is ", name, ", and I'm ", age, " years old.") // 输出: // My name is Alice, and I'm 20 years old. // (自动换行)
内蔵インターフェースエラー
type error interface {
//只要实现了Error()函数,返回值为String的都实现了err接口
Error() String
}
ご覧のとおり、error
インターフェイスにはError()
文字列型のエラー メッセージを返すメソッドが 1 つだけ含まれています。したがって、エラーの種類をカスタマイズしたい場合は、Error()
メソッドを実装するだけで済みます。
以下は、ゼロ除算エラーを表すカスタム エラー タイプの例です。
type DivideError struct {
dividend int
divisor int
}
func (de *DivideError) Error() string {
return fmt.Sprintf("error: divide %d by %d", de.dividend, de.divisor)
}
func divide(dividend, divisor int) (int, error) {
if divisor == 0 {
return 0, &DivideError{
dividend, divisor}
}
return dividend / divisor, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
}
この例では、DivideError
被除数と除数という 2 つの変数を含む構造体を定義します。次に、Error()
除数がゼロの場合にエラー メッセージを返すこの構造体のメソッドを定義します。次に、divide()
2 つの数値の商を計算し、計算結果とエラー メッセージを返す関数を定義します。除数が 0 の場合、DivideError
type のエラーを返します。最後に関数内で関数をmain()
呼び出し、返されたエラーが空でない場合はエラーメッセージを出力し、そうでない場合は計算結果を出力します。divide()
つまり、error
インターフェイスは Go 言語で非常に一般的に使用されるインターフェイスであり、エラー情報を表現するために使用されます。実際の開発では、error
インターフェイスを使用してエラーの種類を定義し、呼び出し元にエラー情報を返すことがよくあります。インターフェースを合理的に使用することでerror
、プログラムの耐障害性と堅牢性を向上させることができます。